2009-06-23 26 views
9

La siguiente función en MySQLMySQL y Java MD5 MD5 no es igual

MD5( 'secret') genera 5ebe2294ecd0e0f08eab7690d2a6ee69

me gustaría tener una función de Java para generar la misma salida. Pero

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 ]; 
     sb.append((int)(0x00FF & b)); 
     if(i+1 <bytes.length) { 
      sb.append("-"); 
     } 
    } 
    return sb.toString(); 
} 

genera codificación

94-190-34-148-236-208-224-240-142-171-118-144-210-166-238-105 

Respuesta

24

Trate de base 16. Sólo para empezar ... 94 en la base 16 es 5E.

** Edición: ** trate de cambiar su método getString:

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(); 
} 
+0

@Randolpho: si b <0x10, necesita almohadilla con 0 – laalto

+0

punto Excelente; editado para incluir el cheque de @mihi (que es mejor IMO que una verificación de valor de byte). – Randolpho

+0

has olvidado el() en hex.length() –

2

considerar convertir sus bytes decimales a hexadecimal. Por ejemplo, 94 base 10 es 5e base 16.

3

Esos dos son iguales. El de Java parece estar en decimal. Convierta a hexadecimal.

2

Eso es porque la base es diferente. El resultado de MySQL MD5 está en base-16, mientras que Java MD5 está en base-10.

Ojalá pudiera ayudarte más, pero mis cálculos apestan. Un amigo mío me ayudó a generar una suma de comprobación de base 10 a partir de una suma de comprobación de base 16 en PHP, pero perdí el guión. Espero que puedas encontrar tu respuesta basada en esto.

6

reemplazar

sb.append((int)(0x00FF & b)); 
if(i+1 <bytes.length) { 
    sb.append("-"); 
} 

por

String hex = Integer.toHexString((int) 0x00FF & b); 
if (hex.length == 1) sb.append("0"); 
sb.append(hex); 
+0

Te daría más de +1 si pudiera. :) – Randolpho

0

vez de reinventar la rueda, trate de Apache Commons códec (http://commons.apache.org/codec/) que se encargará de la codificación hexadecimal para usted con Hex.encodeHex (byte [])

private String encodeAsMD5(String password) { 
    try { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] bytes = md.digest(password.getBytes()); 
     return new String(Hex.encodeHex(bytes)); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
4

Esto se puede acortar a una línea usando la utilidad classe s de la biblioteca Apache Commons Codec (http://commons.apache.org/codec)

String md = org.apache.commons.codec.digest.DigestUtils.md5hex("whatever"); 
0

Utilice las clases de utilidad de la biblioteca Apache Commons Códec: http://commons.apache.org/codec/

String password = org.apache.commons.codec.digest.DigestUtils.md5Hex("password"); 
System.out.println(password); 
1
String password = org.springframework.util.DigestUtils.md5DigestAsHex("password".getBytes()) 
System.out.println(password) 
0

Mira cómo lo hago, el código es auto explicables !código

Java:

public static void main(String a[]) throws NoSuchAlgorithmException { 
    String passClear = "cleartext"; 
    MessageDigest md5 = MessageDigest.getInstance("MD5"); // you can change it to SHA1 if needed! 
    md5.update(passClear.getBytes(), 0, passClear.length()); 
    System.out.printf("MD5: %s: %s ", passClear, new BigInteger(1, md5.digest()).toString(16)); 
} 

Salida:

MD5: texto claro: 5ab677ec767735cebd67407005786016

Mysql consulta que produce el mismo hash:

SELECT md5('cleartext'); 

Salida:

md5 ('texto claro')
5ab677ec767735cebd67407005786016