2010-11-29 18 views
6

No sé cómo llevar a cabo estas pocas líneas de php para java ..hash MD5 es diferente

$varInHex = "\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x12\x36\x22\x31\xCA\x22\x11\x41\x62\x21\x22\x01\x55\x22\x71\x42\x10\x36";<br/><br/> 
$result = md5($varInHex); 
echo $result; 

Bueno, me trató de convertirlo, pero estoy consiguiendo un resultado diferente!

byte[] seq20 = new byte[]{(byte)0x22,(byte)...etc...}; 
String str = seq20.toString(); 
String result = md5(str); 
System.out.println(result); 

public static String md5(String source) { 
    try { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] bytes = md.digest(source.getBytes("UTF-8")); 
     return getString(bytes); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

private static String getString(byte[] bytes) { 
    StringBuffer sb = new StringBuffer(); 
    for (int i = 0; i < bytes.length; i++) { 
     byte b = bytes[i]; 
     String hex = Integer.toHexString((int) 0x00FF & b); 
     if (hex.length() == 1) { 
      sb.append("0"); 
     } 
     sb.append(hex); 
    } 
    return sb.toString(); 
} 

resultado en Java es diferente de resultados en PHP ..

¿Me puede ayudar por favor ?? Gracias de antemano :)

Respuesta

5

No se puede utilizar directamente sin seq20 convirtiéndola así cuerda? lo haría de esta manera:

md.update(seq20); 
byte[] md5sum = md.digest(); 
BigInteger bigInt = new BigInteger(1, md5sum); 
output = bigInt.toString(16); 
while (output.length() < 32) { 
    output = "0"+output; 
} 
+0

¡Muchas gracias amigo! ¡¡¡Esta es la respuesta!!! ¡Saludos! – fran

+2

Ver la respuesta de @adves. Es una buena lección: no arriesgue sus propias soluciones a problemas comunes si puede evitarlo, porque inevitablemente obtendrá algo mal. – amalloy

+0

@amalloy Gracias por su pista, lo arreglé. – stacker

0

Supongo que PHP está evaluando lo anterior como una cadena, no como hexadecimal. Y Java lo está haciendo como lo esperabas.

3

La solución aceptada:

md.update(seq20); 
byte[] md5sum = md.digest(); 
BigInteger bigInt = new BigInteger(1, md5sum); 
output = bigInt.toString(16); 
if (output.length() == 31) { 
    output = "0"+output; 
} 

contiene un IMPLEMENTACIÓN que fallará 1/256 veces porque la salida de md5sum puede tener más de un cero inicial. Un ejemplo de entrada md5 que provocará este error es: "15446: 68106" (sin comillas).

Recomiendo usar apache commons DigestUtils.md5Hex si necesita un md5 que coincida con la implementación de php.

5

Ninguna de las otras dos respuestas son afirmativamente mal, pero desde un punto de vista de la elegancia, tenga en cuenta lo siguiente

String MD5(String... strings) { 
    MessageDigest md = null; 
    try { 
     md = MessageDigest.getInstance("MD5"); 
     for(final String s : strings) { 
      md.update(s.getBytes()); 
     } 
    } catch (NoSuchAlgorithmException ex) { 
     throw new RuntimeException("MD5 Cryptography Not Supported"); 
    } 
    final BigInteger bigInt = new BigInteger(1, md.digest()); 
    return String.format("%032x", bigInt); 
} 

edición: El uso de String... varargs es totalmente opcional, pero hace la función de un poco más fácil, ya que evita la sobrecarga de la concatenación de cadenas en la función de llamada.

+3

Acabo de implementar esta solución y tengo que decir que me gusta bastante. –

Cuestiones relacionadas