2009-06-23 8 views
9

La fonction suivante dans MySQLMD5 MySQL et Java MD5 pas égal

MD5( 'secret') génère 5ebe2294ecd0e0f08eab7690d2a6ee69

Je voudrais avoir une fonction Java pour générer la même sortie. Mais

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

génère

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

Répondre

24

Essayez le codage en base 16. Pour vous aider à démarrer ... 94 dans la base 16 est 5E.

** Edit: ** Essayez de changer votre méthode 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, vous devez pad avec 0 – laalto

+0

Excellent point; édité pour inclure le contrôle de @ mihi (qui est meilleur IMO qu'un contrôle de valeur d'octet). – Randolpho

+0

vous avez oublié le() dans hex.length() –

2

Tenir compte de convertir vos octets décimales en hexadécimal. Par exemple 94 base 10 est 5e base 16.

3

Ces deux sont égaux. Le Java semble être en décimal. Convertissez-le en hexadécimal.

2

C'est parce que la base est différente. Le résultat MySQL MD5 est en base-16, tandis que le Java MD5 est en base-10. Je voudrais pouvoir vous aider davantage, mais mes maths pue. Un de mes amis m'a aidé à générer une somme de contrôle de base 10 à partir d'une somme de contrôle de base 16 en PHP, mais j'ai perdu le script. J'espère que vous trouverez votre réponse sur cette base.

6

remplacer

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

par

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

Je vous donnerais plus de +1 si je le pouvais. :) – Randolpho

0

Plutôt que de réinventer la roue, essayez codec (http://commons.apache.org/codec/) commons Apache qui se chargera de l'encodage hexagonal pour vous avec Hex.encodeHex (octet [])

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

Ceci peut être raccourci en une ligne à l'aide de la classe utilitaire s de la bibliothèque Codec Apache Commons (http://commons.apache.org/codec)

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

Utilisez les classes utilitaires de la bibliothèque Codec Apache Commons: 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

Regardez comment je le fais, le code est auto explicables !

code 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)); 
} 

Sortie:

MD5: texte clair: 5ab677ec767735cebd67407005786016

Mysql requête qui produit le même hachage:

SELECT md5('cleartext'); 

Sortie:

md5 ('texte clair')
5ab677ec767735cebd67407005786016

Questions connexes