dos de tres bytes diferentes en la función de hash sha256

Estoy usando esta función para calcular el SHA 256

public static String getSHA1(String plainText) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("SHA-256");

            md.update(plainText.getBytes(Charset.forName("UTF-8")));
            StringBuffer hexString = new StringBuffer();
            byte[] bytes = md.digest();
            for (int i = 0; i < bytes.length; i++) {
                hexString.append(Integer.toHexString(0xFF & bytes[i]));
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

And to be sure of my results, I check this online website http://onlinemd5.com/

los resultados entre mi código y el en línea son casi los mismos, pero usted sabe que debe ser igual . por ejemplo

mi testículo simple:

1234567

el resultado del sitio web

8BB0CF6EB9B17D0F7D22B456F121257DC1254E1F01665370476383EA776DF414

mi resultado de código

8bb0cf6eb9b17df7d22b456f121257dc1254e1f1665370476383ea776df414

y esto es más ejemplos:

7777777
8C1CDB9CB4DBAC6DBB6EBD118EC8F9523D22E4E4CB8CC9DF5F7E1E499BBA3C10
8c1cdb9cb4dbac6dbb6ebd118ec8f9523d22e4e4cb8cc9df5f7e1e499bba3c10


147258
7A2EC40FF8A1247C532309355F798A779E00ACFF579C63EEC3636FFB2902C1AC
7a2ec4ff8a1247c53239355f798a779e0acff579c63eec3636ffb292c1ac


888888
92925488B28AB12584AC8FCAA8A27A0F497B2C62940C8F4FBC8EF19EBC87C43E
92925488b28ab12584ac8fcaa8a27af497b2c6294c8f4fbc8ef19ebc87c43e

Sé que este es tal vez sobre la codificación. pero mira, usé utf-8 que es lo que el sitio web usó

0
Por favor, no use StringBuffer a menos que sea necesario, fue reemplazado por StringBuilder hace casi diez años.
agregado el autor Peter Lawrey, fuente
agregado el autor nrathaus, fuente

1 Respuestas

Este es el problema:

hexString.append(Integer.toHexString(0xFF & bytes[i]));

Esto perderá cualquier 0 inicial, en otras palabras, cualquier byte menor a 16 saldrá como un solo dígito hexadecimal en lugar de dos.

Hay muchas soluciones para esto. Por ejemplo:

  • Manually append 0 if the value is between 0 and 15 (ick)
  • Use String.format("%02x", bytes[i] & 0xff)
  • Use a full "byte array to hex conversion" method in a utility library (there are loads around)
0
agregado
@ user3110137: Donde estás usando Integer.toHexString (...)
agregado el autor Jon Skeet, fuente
Estimado Sr. Jon. ¿Dónde debería usar el String.format ? Por favor. gracias por tu respuesta
agregado el autor user3110137, fuente