2009-06-23 11 views
9

Die nächste Funktion in MySQLMySQL MD5 und Java MD5 nicht gleich

MD5( 'secret') erzeugt 5ebe2294ecd0e0f08eab7690d2a6ee69

Ich möchte eine Java-Funktion haben, um die gleiche Leistung zu erzeugen. Aber

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

erzeugt

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

Antwort

24

Try-Codierung in der Basis 16 nur für den Anfang ... 94 in der Basis 16 5E ist.

** Edit: ** Versuchen Sie getString Methode zu ändern:

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: wenn b <0x10, Sie müssen mit 0 – laalto

+0

Ausgezeichneten Punkt-Pad; bearbeitet, um die @ mihi-Prüfung einzuschließen (was IMO besser ist als eine Byte-Wertüberprüfung). – Randolpho

+0

haben Sie die() in hex.length() vergessen –

2

Betrachten Sie Ihre Dezimal-Bytes in hexadezimal konvertieren. Zum Beispiel ist 94 Basis 10 5e Basis 16.

3

Diese beiden sind gleich. Das Java scheint in Dezimal zu sein. Wandle es in hexadezimal um.

2

Das liegt daran, dass die Basis anders ist. Das MySQL-MD5-Ergebnis befindet sich in Basis-16, während das Java-MD5 in Basis-10 ist.

Ich wünschte, ich könnte dir weiter helfen, aber meine Mathe stinkt. Ein Freund von mir half mir, eine Basis-10-Prüfsumme von einer Basis-16-Prüfsumme in PHP zu generieren, aber ich habe das Skript verloren. Hoffe, Sie können Ihre Antwort darauf basierend finden.

6

ersetzen

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

von

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

Ich würde dir mehr als +1 geben, wenn ich könnte. :) – Randolpho

0

Anstatt das Rad neu zu erfinden, versuchen Apache commons Codec (http://commons.apache.org/codec/), die die Hex-Codierung für Sie mit Hex.encodeHex (byte []) wird handhaben

4

Dies kann mit der Utility-Klasse zu einem Einzeiler gekürzt werden s aus der Apache Commons Codec-Bibliothek (http://commons.apache.org/codec)

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

Verwenden Sie die Utility-Klassen aus der Apache Commons Codec-Bibliothek: 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

Sehen Sie, wie ich es tue, ist der Code selbst erklärbar !

Java-Code:

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

Ausgang:

MD5: Klartext: 5ab677ec767735cebd67407005786016

Mysql-Abfrage, die den gleichen Hash erzeugt:

SELECT md5('cleartext'); 

Ausgang:

md5 ('Klartext')
5ab677ec767735cebd67407005786016