2010-11-29 40 views
6

Je ne sais pas comment réaliser ces quelques lignes de php java ..hachage MD5 est différent

$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; 

Eh bien, j'ai essayé de le convertir, mais j'obtenir un résultat différent!

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

résultat en Java est différent du résultat en php ..

Pouvez-vous me aider ?? s'il vous plaît Merci d'avance :)

Répondre

5

Tu ne peux pas utiliser seq20 directement sans le convertir chaîne ainsi? je le ferais de cette façon:

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

Merci beaucoup mon pote !!!!! C'est la réponse !!! Salutations! – fran

+2

Voir la réponse de @adves. C'est une bonne leçon: ne jetez pas vos propres solutions à des problèmes communs si vous pouvez l'aider, car vous aurez inévitablement quelque chose de mal. – amalloy

+0

@amalloy Merci pour votre indice, j'ai réparé cela. – stacker

0

Je suppose que PHP évalue le ci-dessus comme une chaîne, pas hex. Et Java le fait comme vous l'attendez.

3

La solution retenue:

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

contient une implemention qui échouera 1/256 fois parce que la sortie de md5sum peut avoir plus d'un zéro. Un exemple d'entrée md5 qui provoquera cette erreur est: "15446: 68106" (sans guillemets).

Je recommande d'utiliser les communs DigestUtils.md5Hex d'apache si vous avez besoin d'un md5 qui correspond à l'implémentation de php.

5

Aucune des deux autres réponses sont affirmativement mal, mais d'un point de vue de l'élégance, considèrent les éléments suivants

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

modifier: L'utilisation de String... varargs est totalement facultative, mais elle rend la fonction un peu plus facile, car cela évite la surcharge de la concaténation de chaînes dans la fonction d'appel.

+3

Je viens de mettre en œuvre cette solution et je l'ai pour dire que je l'aime beaucoup. –