2013-08-18 101 views
0

我使用c#將字符串轉換爲MD5散列。然後我使用Java將字符串轉換爲MD5哈希。我注意到結果並不相同,即使是相同的輸入字符串。Java MD5散列不匹配C#散列

這是我的Java代碼:

public String encrypt(String message) 
{ 
    String digest = null; 
    try 
    { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] hash = md.digest(message.getBytes("UTF-8")); 
     StringBuilder sb = new StringBuilder(2*hash.length); 

     for(byte b : hash) 
     { 
      sb.append(String.format("%02x", b&0xff)); 
     } 

     digest = sb.toString(); 
    } 
    catch (Exception e) 
    { 
     //Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show(); 
    } 

    return digest; 

} 

}

這裏是我的C#代碼:

public static string Encrypt(string input) 
    { 
     Byte[] inputBytes = Encoding.UTF8.GetBytes(input); 

     Byte[] hashedBytes = new MD5CryptoServiceProvider().ComputeHash(inputBytes); 

     return BitConverter.ToString(hashedBytes); 
    } 

我必須將Java代碼更容易獲得。有沒有什麼辦法可以修改Java代碼,使得生成的哈希與C#哈希相同?

預先感謝您。

+1

我會檢查兩個解碼器輸出的實際字節。確保你沒有在那裏的物料清單...當他們參與時,事情會變得怪異。 :P – cHao

+1

[This](http://stackoverflow.com/questions/2920044/how-can-you-generate-the-same-md5-hashcode-in-c-sharp-and-java)應該可以幫助你.. –

回答

2

他們都產生相同的結果,但輸出字符串格式是不同

Java: 264fcf838c8e4b9d17c510cd5b8b9b78 
C#: 26-4F-CF-83-8C-8E-4B-9D-17-C5-10-CD-5B-8B-9B-78 

最簡單的Java端是隻返工你的循環略有增加破折號和大寫十六進制BitConverter.ToString()增加;

boolean add_dash = false; 
for(byte b : hash) 
{ 
    if(add_dash) 
     sb.append("-"); 
    add_dash = true; 
    sb.append(String.format("%02X", b&0xff)); 
} 

這將使雙方產生格式

26-4F-CF-83-8C-8E-4B-9D-17-C5-10-CD-5B-8B-9B-78 

這是簡單的做反向的C#的一面,只要改變你的迴歸MD5總和;

return BitConverter.ToString (hashedBytes).Replace("-", "").ToLowerInvariant(); 
0

我相信這是你正在尋找的答案:

StringBuilder hexString = new StringBuilder() 
for (byte b: hash) { 
    String hex = Integer.toHexString(b & 0xFF); 
    if (hex.length() == 1) { 
     hexString.append("0"); 
    } 
    hexString.append(hex.toUpperCase()); 
    hexString.append("-"); 
} 

hexString.toString()應該產生相同的結果BitConverter.ToString(byte[])方法。