SHA-1 affiche une sortie différente en UTF-8 Java


J'ai créé une fonction Sha1 qui fonctionne la plupart du temps de la même manière que la fonction sha1 de PHP et donne la même sortie. Mais quand les caractères UTF-8 apparaissent, ils diffèrent. Par exemple, avec la chaîne "hj6", en PHP, j'obtiens" 7f9d591232c5fde9f757c4d8472921517991dc3c "tandis que dans ma fonction Java, j'obtiens"c963b7df20488e9ef50c1a309c1fa747ab5d8822". Voici le Java fonction:

Https://github.com/Razican/Java-Utils/blob/master/src/razican/utils/StringUtils.java#L115

Lequel est le bon? Comment puis-je l'implémenter en Java?

Author: Razican, 2014-11-14

1 answers

La sortie correcte est 7f9d591232c5fde9f757c4d8472921517991dc3c. Vous supprimez un octet:

        final MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.update(str.getBytes("UTF-8"), 0, str.length());
        sha1hash = md.digest();

Le code ci-dessus suppose que la longueur de la chaîne UTF-16 est égale à la longueur du tableau d'octets codés UTF-8. Si le formulaire UTF-8 est plus long que le formulaire UTF-16, le résumé sera incorrect.

codepoint   glyph   escaped    UTF-8           info
=======================================================================
U+0068      h       \u0068     68,             BASIC_LATIN, LOWERCASE_LETTER
U+006a      j       \u006a     6a,             BASIC_LATIN, LOWERCASE_LETTER
U+0036      6       \u0036     36,             BASIC_LATIN, DECIMAL_DIGIT_NUMBER
U+00ac      ¬       \u00ac     c2,ac,          LATIN_1_SUPPLEMENT, MATH_SYMBOL

En utilisant la longueur du tableau:

        byte[] utf8 = str.getBytes(StandardCharsets.UTF_8);
        md.update(utf8, 0, utf8.length);

Vous pouvez également utiliser md.update(str.getBytes(StandardCharsets.UTF_8))

 1
Author: McDowell, 2014-11-13 22:12:14