Cuando me calcular en Java SHA-256 de una cadena de caracteres con el siguiente método

public static void main(String[] args) throws NoSuchAlgorithmException {

    MessageDigest md = MessageDigest.getInstance("SHA-256");

    byte[] hash = md.digest("password".getBytes());

    StringBuffer sb = new StringBuffer();
    for(byte b : hash) {
        sb.append(Integer.toHexString(b & 0xff));
    }

    System.out.println(sb.toString());
}

Puedo obtener :

5e884898da2847151d0e56f8dc6292773603dd6aabbdd62a11ef721d1542d8

en la línea de comandos hago lo siguiente (tengo la necesidad de -n para no añadir un salto de línea) :

echo -n "password" | sha256sum

y obtener

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

si comparamos estas más cerca que encontrar 2 sutiles diferencias

5e884898da2847151d0e56f8dc6292773603dd6aabbdd62a11ef721d1542d8
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

o :

5e884898da28   47151d0e56f8dc6292773603d   d6aabbdd62a11ef721d1542d8
5e884898da28 0 47151d0e56f8dc6292773603d 0 d6aabbdd62a11ef721d1542d8

Cual de las 2 es correcta aquí?

Resultado: Ambos son, pero me equivoqué…

se fija mediante el uso de :

    StringBuffer sb = new StringBuffer();
    for(byte b : hash) {
        sb.append(String.format("%02x", b));
    }

Gracias!

7 Comentarios

  1. 29

    Voy a tomar una conjetura razonable: ambos son la salida de la misma de digerir, pero en el código Java que genera la byte[] resultado como una cadena hexadecimal, que la salida de los pequeños valores de byte (menos de 16) sin un 0 a la izquierda. Así que un byte con valor «0x0d» se escribe como «d» no «0d».

    • Sí, acabo de ver tu actualización con el código, este es el problema. Integer.toHexString() no va a escribir el 0 a la izquierda. Podría ser más fácil simplemente extraordinario caso de los valores de menos de 16 y escribir un ‘0’ en la parte delantera.
    • Tonto de mí! Gracias por la rápida respuesta! Yo tuve suerte con mi MD5 aplicación. Gran guardar…
  2. 10

    El culpable es el toHexString. Parece ser la salida de 6 por el valor de 6, mientras que el sha256sum uno está saliendo 06. El Java docs para Integer.toHexString() estado:

    Este valor se convierte en una cadena de dígitos ASCII en hexadecimal (base 16) con no extra líder 0s.

    Los otros ceros en la cadena no están siendo afectados, ya que son la segunda mitad de los bytes (por ejemplo, 30).

    Una forma de solucionarlo sería cambiar:

    for(byte b : hash) {
        sb.append(Integer.toHexString(b & 0xff));
    }

    a:

    for(byte b : hash) {
        if (b < 16) sb.append("0");
        sb.append(Integer.toHexString(b & 0xff));
    }
  3. 7

    Ambos están a la derecha – es el código de Java que es la culpa, porque no es la impresión de la 0 a la izquierda de un valor hexadecimal menos de 0x10.

  4. 2

    A la generada por sha256sum parece correcta. Su aplicación parece a colocar los dos ceros.

  5. 1

    Con @paxdiablo idea tuvo un problema con un gran número de aparecer como negativos, por lo que

    Lugar de:

    for(byte b : hash) {
        sb.append(Integer.toHexString(b & 0xff));
    }

    usted podría hacer:

    for(byte b : hash) {
        if (b > 0 && b < 16) {
            sb.append("0");
        }
        sb.append(Integer.toHexString(b & 0xff));
    }

    Y leer @Sean Owen respuesta.

  6. 0

    También se puede obtener el resultado correcto uso de este:

    MessageDigest md = MessageDigest.getInstance("SHA-256");
    
    byte[] hash = md.digest("password".getBytes());
    
    BigInteger bI = new BigInteger(1, hash);
    
    System.out.println(bI.toString(16));
    • No, este código es un error. El BigInteger.toString(16) no contienen ceros a la izquierda.

Dejar respuesta

Please enter your comment!
Please enter your name here