HMAC-SHA1: Wie macht man es richtig in Java?

Lesezeit: 3 Minuten

Benutzer-Avatar
Markieren

Ich hash einige Werte mit HMAC-SHA1 und verwende den folgenden Code in Java:

public static String hmacSha1(String value, String key) {
    try {
        // Get an hmac_sha1 key from the raw key bytes
        byte[] keyBytes = key.getBytes();           
        SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");

        // Get an hmac_sha1 Mac instance and initialize with the signing key
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(signingKey);

        // Compute the hmac on input data bytes
        byte[] rawHmac = mac.doFinal(value.getBytes());

        // Convert raw bytes to Hex
        byte[] hexBytes = new Hex().encode(rawHmac);

        //  Covert array of Hex bytes to a String
        return new String(hexBytes, "UTF-8");
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

Hex() gehört org.apache.commons.codec

In PHP gibt es eine ähnliche Funktion hash_hmac(algorithm, data, key) die ich verwende, um die von meiner Java-Implementierung zurückgegebenen Werte zu vergleichen.

Also der erste Versuch ist:

hash_hmac("sha1", "helloworld", "mykey") // PHP

das gibt zurück: 74ae5a4a3d9996d5918defc2c3d475471bbf59ac

Meine Java-Funktion kehrt zurück 74ae5a4a3d9996d5918defc2c3d475471bbf59ac auch.

Ok, es scheint zu funktionieren. Dann versuche ich, einen komplexeren Schlüssel zu verwenden:

hash_hmac("sha1", "helloworld", "PRIE7$oG2uS-Yf17kEnUEpi5hvW/#AFo") // PHP

das gibt zurück: e98bcc5c5be6f11dc582ae55f520d1ec4ae29f7a

Während dieses Mal mein Java-Impl zurückkehrt: c19fccf57c613f1868dd22d586f9571cf6412cd0

Der von meinem PHP-Code zurückgegebene Hash entspricht nicht dem von meiner Java-Funktion zurückgegebenen Wert, und ich kann nicht herausfinden, warum.

Irgendwelche Tipps?

  • Würde es $-Zeichen in PHP nicht als Variable interpretieren?

    – Alex Gitelman

    10. Juni 2011 um 22:16 Uhr

  • Warum brauchen Sie die Hex-Phase?

    – AlikElzin-kilaka

    10. Juni 2014 um 6:51 Uhr


  • Ich habe das gleiche Problem und kann es nicht lösen stackoverflow.com/questions/60971203/…

    – AR

    2. April 2020 um 7:30 Uhr

Verwenden Sie auf Ihrer PHP-Seite einfache Anführungszeichen um den Schlüssel, damit die $ Zeichen wird nicht als Variablenreferenz behandelt. dh,

hash_hmac("sha1", "helloworld", 'PRIE7$oG2uS-Yf17kEnUEpi5hvW/#AFo')

Ansonsten ist der Schlüssel, den Sie wirklich bekommen PRIE7-Yf17kEnUEpi5hvW/#AFo (Angenommen, die Variable $oG2uS ist nicht definiert).

Empfehlen Apache Common Codec-Bibliothekganz einfach und leicht zu bedienen.
HmacUtils.hmacSha1Hex(key, string_to_sign);

  • Veraltet. Verwenden Sie jetzt stattdessen Folgendes: new HmacUtils(HmacAlgorithms.HMAC_SHA_1, key).hmacHex(inputStreamOfContent);

    – wildes_nichts

    24. September 2019 um 18:02 Uhr

Jedes $-Symbol in doppelten Anführungszeichen (“”) wird in PHP als Variable betrachtet. Sie können den Fehler vermeiden, indem Sie entweder einfache Anführungszeichen verwenden, wie vom vorherigen Kommentator angegeben, oder Sie können das Dollarzeichen wie folgt maskieren

hash_hmac("sha1", "helloworld", "PRIE7\$oG2uS-Yf17kEnUEpi5hvW/#AFo")

Beachten Sie, dass $ jetzt \$ ist

Die anderen Antworten, die auf HmacUtils von Apache Commons hinweisen, sind inzwischen veraltet. Apache Commons empfiehlt jetzt die Verwendung von:

new HmacUtils(HmacAlgorithms.HMAC_SHA_1, key).hmacHex(string_to_sign)

Im Javaund verwenden Maven:

Fügen Sie die folgende Abhängigkeit in die hinzu pom.xml:

 <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.4</version>
    </dependency>

und versuchen Sie dann, es damit zu signieren

HmacUtils.hmacSha1Hex(key, string_to_sign);

  • hmacSha1Hex ist veraltet, bitte aktualisieren Sie Ihre Antwort

    – Rajat

    11. März 2020 um 13:05 Uhr

  • hmacSha1Hex ist veraltet, bitte aktualisieren Sie Ihre Antwort

    – Rajat

    11. März 2020 um 13:05 Uhr

1051210cookie-checkHMAC-SHA1: Wie macht man es richtig in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy