2010-11-15 2 views
7

Ich habe seit Stunden daran gearbeitet, aber ich kann es nicht funktionieren.Java md5, die PHP-Methode

Grundsätzlich entwickle ich einen REST-Client in Java für einen REST-Server in PHP. Sowohl der Client als auch der Server müssen das MD5 einer Zeichenkette berechnen, und der Server vergleicht sie für die Authentifizierung (irgendwie).

Auf dem Server, der PHP-Code ist:

md5("getTokenapi_keybf8ddfs845jhre980543jhsjfro93fd8capi_ver1tokeniud9ER£jdfff"); 

, die erzeugt:

4d7b2e42c3dfd11de3e77b9fe2211b87 

Nice! Hier

ist der Code für den Kunden:

import java.security.*; 
.... 
String s = "getTokenapi_keybf8ddfs845jhre980543jhsjfro93fd8capi_ver1tokeniud9ER£jdfff"; 
byte[] bytesOfMessage = s.getBytes("UTF-8"); 
MessageDigest md = MessageDigest.getInstance("MD5"); 
byte[] thedigest = md.digest(bytesOfMessage);  

System.out.println("String2: " + thedigest);   
System.out.println("String3: " + new String(thedigest)); 

Das erzeugt:

String2: [[email protected] 
String3: M{.B�����{��!� 

Wie kann ich Java bekommen die md5 berechnen die gleiche Art und Weise zusammenzufassen PHP tut, bitte?

Danke, Dan

Antwort

20

das Probieren Sie:

public static String md5(String input) throws NoSuchAlgorithmException { 
    String result = input; 
    if(input != null) { 
     MessageDigest md = MessageDigest.getInstance("MD5"); //or "SHA-1" 
     md.update(input.getBytes()); 
     BigInteger hash = new BigInteger(1, md.digest()); 
     result = hash.toString(16); 
     while(result.length() < 32) { //40 for SHA-1 
      result = "0" + result; 
     } 
    } 
    return result; 
} 

Code von http://web.archive.org/web/20140209230440/http://www.sergiy.ca/how-to-make-java-md5-and-sha-1-hashes-compatible-with-php-or-mysql/

+0

Danke, ich, dass ich fand gerade nach der Frage zu schreiben. Und es funktioniert. – dan

3

mich gefunden:

import java.math.BigInteger; 
.. 
public static String md5(String input) throws NoSuchAlgorithmException { 
     String result = input; 
     if(input != null) { 
      MessageDigest md = MessageDigest.getInstance("MD5"); //or "SHA-1" 
      md.update(input.getBytes()); 
      BigInteger hash = new BigInteger(1, md.digest()); 
      result = hash.toString(16); 
      if ((result.length() % 2) != 0) { 
       result = "0" + result; 
      } 
     } 
     return result; 
    } 

Quelle: http://www.sergiy.ca/how-to-make-java-md5-and-sha-1-hashes-compatible-with-php-or-mysql/

+2

Lol ich habe meinen Beitrag gelöscht, 3 Leute, die diese Frage mit derselben Antwort beantworten, sind irgendwie lächerlich ^^ – thecodeassassin

2

Sie geben die rohe md5-Ausgabe aus, die nur aus einer Menge Bytes besteht. Sie würden das gleiche Ergebnis in PHP bekommen, wenn Sie md5 sagten ("some string", true).

Sie müssen die Bytes stattdessen in ASCII-Zeichen konvertieren.

1

Sie müssen konvertieren das Ergebnis in die HEX-Darstellung. Dies ist, wie es in Fast MD5 library getan wird:

private static final char[] HEX_CHARS = { '0', '1', '2', '3', '4', '5', 
      '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; 

    /** 
    * Turns array of bytes into string representing each byte as unsigned hex 
    * number. 
    * 
    * @param hash 
    *   Array of bytes to convert to hex-string 
    * @return Generated hex string 
    */ 
    public static String asHex(byte hash[]) { 
     char buf[] = new char[hash.length * 2]; 
     for (int i = 0, x = 0; i < hash.length; i++) { 
      buf[x++] = HEX_CHARS[(hash[i] >>> 4) & 0xf]; 
      buf[x++] = HEX_CHARS[hash[i] & 0xf]; 
     } 
     return new String(buf); 
    } 

So müssen Sie System.out.println("String3: " + asHex(thedigest));

1

anrufen, wenn Sie Feder Sicherheits-Framework verwenden, nur tun:

import org.springframework.security.authentication.encoding.* 

new Md5PasswordEncoder().encodePassword("myWord",null) 

das gleiche Ergebnis wie PHP::md5(). Ich bestätige

See more examples