2010-11-15 55 views
7

我一直在這個工作幾個小時,但我無法得到它的工作。Java md5,PHP的方式

基本上我正在爲Java中的REST服務器開發一個REST客戶端。客戶端和服務器都必須計算一個字符串的md5,服務器會將它們進行比較以進行身份​​驗證(類似)。

在服務器上,PHP代碼爲:

md5("getTokenapi_keybf8ddfs845jhre980543jhsjfro93fd8capi_ver1tokeniud9ER£jdfff"); 

產生:

4d7b2e42c3dfd11de3e77b9fe2211b87 

不錯!

下面是客戶端的代碼:產生

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

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

我怎樣才能獲得Java來計算MD5和以同樣的方式PHP做,好嗎?

感謝, 丹

回答

20

這給一試:

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

代碼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

謝謝,我發現自己寫的問題後直。它的工作原理。 – dan 2010-11-15 11:08:27

3

發現自己:

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

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

+2

大聲笑我刪除了我的帖子,3人用相同的答案回答這個問題有點荒謬^^ – thecodeassassin 2010-11-15 11:09:27

2

您正在輸出原始md5輸出,這只是一堆字節。如果你說md5(「some string」,true),你會在php中得到相同的結果。

您需要將字節轉換爲ascii字符。

1

您需要將轉換成的結果轉換爲HEX表示。這是它是如何在Fast MD5 library完成:

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

所以,你需要調用System.out.println("String3: " + asHex(thedigest));

1

,如果你使用Spring Security框架,只是做:

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

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

相同的結果PHP::md5()我確認

See more examples