Message Digest (hash) est l'octet [] dans l'octet [] sortant
Un résumé de message est défini comme une fonction qui prend un tableau d'octets bruts et renvoie un tableau d'octets bruts (aka byte[]
). Par exemple, SHA-1 (Secure Hash Algorithm 1) a une taille de résumé de 160 bits ou 20 octets. Les tableaux d'octets bruts ne peuvent généralement pas être interprétés comme des encodages de caractères comme UTF-8 , car chaque octet de chaque ordre n'est pas un encodage légal. Donc, les convertir en un String
avec:
new String(md.digest(subject), StandardCharsets.UTF_8)
peut créer des séquences illégales ou avoir des pointeurs de code vers des mappages Unicode non définis :
[�a�ɹ??�%l�3~��.
Encodage binaire en texte
Pour cela, l' encodage binaire en texte est utilisé. Avec les hachages, celui qui est le plus utilisé est l' encodage HEX ou Base16 . Fondamentalement, un octet peut avoir la valeur de 0
to 255
(ou -128
to 127
signed) qui est équivalente à la représentation HEX de 0x00
- 0xFF
. Par conséquent, hex doublera la longueur requise de la sortie, ce qui signifie qu'une sortie de 20 octets créera une chaîne hexadécimale de 40 caractères, par exemple:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Notez qu'il n'est pas nécessaire d'utiliser le codage hexadécimal. Vous pouvez également utiliser quelque chose comme base64 . Hex est souvent préféré car il est plus facile à lire par les humains et a une longueur de sortie définie sans avoir besoin de remplissage.
Vous pouvez convertir un tableau d'octets en hexadécimal avec la seule fonctionnalité JDK:
new BigInteger(1, token).toString(16)
Notez cependant que BigInteger
cela interprétera le tableau d'octets donné comme un nombre et non comme une chaîne d'octets. Cela signifie que les zéros non significatifs ne seront pas affichés et que la chaîne résultante peut être inférieure à 40 caractères.
Utilisation de bibliothèques pour encoder en HEX
Vous pouvez maintenant copier et coller une méthode octet-hexadécimal non testée à partir de Stack Overflow ou utiliser des dépendances massives comme Guava .
Pour avoir une solution idéale pour la plupart des problèmes liés aux octets, j'ai implémenté un utilitaire pour gérer ces cas: bytes-java (Github)
Pour convertir votre tableau d'octets de résumé de message, vous pouvez simplement faire
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
ou vous pouvez simplement utiliser la fonction de hachage intégrée
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
sans trait d'union, je ne sais pas si cela fera une différence.