Message Digest (Hash) ist Byte [] in Byte [] out
Ein Message Digest ist als eine Funktion definiert, die ein Rohbyte-Array verwendet und ein Rohbyte-Array (auch bekannt als byte[]
) zurückgibt . Zum Beispiel hat SHA-1 (Secure Hash Algorithm 1) eine Digest-Größe von 160 Bit oder 20 Byte. Raw-Byte-Arrays können normalerweise nicht als Zeichencodierungen wie UTF-8 interpretiert werden , da nicht jedes Byte in jeder Reihenfolge eine zulässige Codierung ist. Also konvertiere sie in ein String
mit:
new String(md.digest(subject), StandardCharsets.UTF_8)
Möglicherweise werden einige unzulässige Sequenzen erstellt oder Codezeiger auf undefinierte Unicode- Zuordnungen:
[�a�ɹ??�%l�3~��.
Binär-zu-Text-Codierung
Hierfür wird die Binär-Text- Codierung verwendet. Bei Hashes wird am häufigsten die HEX-Codierung oder Base16 verwendet . Grundsätzlich kann ein Byte den Wert von 0
bis haben255
(oder -128
bis 127
vorzeichenbehaftet) haben, der der HEX-Darstellung von 0x00
- entspricht 0xFF
. Daher verdoppelt hex die erforderliche Länge der Ausgabe, dh eine 20-Byte-Ausgabe erzeugt eine 40 Zeichen lange Hex-Zeichenfolge, z.
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Beachten Sie, dass keine Hex-Codierung erforderlich ist. Sie könnten auch so etwas wie base64 verwenden . Hex wird oft bevorzugt, weil es für Menschen leichter lesbar ist und eine definierte Ausgabelänge hat, ohne dass eine Polsterung erforderlich ist.
Sie können ein Byte-Array nur mit JDK-Funktionalität in Hex konvertieren:
new BigInteger(1, token).toString(16)
Beachten Sie jedoch, dass BigInteger
das angegebene Byte-Array als Zahl und nicht als Byte-Zeichenfolge interpretiert wird . Das bedeutet, dass führende Nullen nicht ausgegeben werden und die resultierende Zeichenfolge kürzer als 40 Zeichen sein kann.
Verwenden von Bibliotheken zum Codieren in HEX
Sie können jetzt eine nicht getestete Byte-zu-Hex-Methode aus dem Stapelüberlauf kopieren und einfügen oder massive Abhängigkeiten wie Guava verwenden .
Um eine Lösung für die meisten bytebezogenen Probleme zu finden, habe ich ein Dienstprogramm implementiert, um diese Fälle zu behandeln: bytes-java (Github)
Um Ihr Nachrichten-Digest-Byte-Array zu konvertieren, können Sie dies einfach tun
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
oder Sie können einfach die integrierte Hash-Funktion verwenden
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
ohne Bindestrich. Ich weiß nicht, ob dies einen Unterschied macht.