2012-10-19 168 views
18

需要從字符串中獲取MD5散列。
獲取錯誤MD5爲空。
我打算從字符串中獲取32個字符的MD5哈希值。MD5散列字符串

using (System.Security.Cryptography.MD5 md5 = 
     System.Security.Cryptography.MD5.Create("TextToHash")) 
{ 
    byte[] retVal = md5.Hash; 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
     sb.Append(retVal[i].ToString("x2")); 
    } 
} 

回答

42

需要從字符串獲得MD5哈希值。

然後,首先需要將字符串轉換爲二進制數據。你怎麼做,這取決於你的要求,但它可能會爲Encoding.GetBytes某些編碼...你需要編制哪些編碼雖然。例如,這個哈希值是否需要匹配其他地方創建的哈希值?

獲取錯誤MD5爲空。

這是因爲您錯誤地使用了MD5.Create。參數是一個算法名稱。您幾乎可以肯定只是使用parameterless overload來代替。

我懷疑你想要的東西,如:

byte[] hash; 
using (MD5 md5 = MD5.Create()) 
{ 
    hash = md5.ComputeHash(Encoding.UTF8.GetBytes(text)); 
} 
// Now convert the binary hash into text if you must... 
+1

如果它來自SQL vachar(max)UTF8是最好的選擇嗎? – Paparazzi

+0

re:無參數重載 - 是否存在默認算法從一個.Net版本變爲下一個的風險?如果是這樣,那麼從一個版本到下一個版本的相同字符串的哈希將不匹配? – xanadont

+2

@xanadont:No. MD5是一種標準化的算法。結果改變基本上是一個錯誤。 –

19

傳遞給Create的字符串是不是「文字湊」,但要使用的算法。我懷疑你想:

using (System.Security.Cryptography.MD5 md5 = 
    System.Security.Cryptography.MD5.Create()) 
{ 
    byte[] retVal = md5.ComputeHash(Encoding.Unicode.GetBytes("TextToHash")); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
     sb.Append(retVal[i].ToString("x2")); 
    } 
} 
+1

嗨裏德:我有一個問題:我怎麼知道使用哪種編碼?在我的情況下,我需要計算我收到的散列作爲查詢字符串。 (所以當它發佈http時,它可能是UTF-8),但是一旦它存儲在.Net字符串中,它現在是否使用Unicode(UTF-16),因爲這是本機編碼?這種轉變是爲我發生的嗎? – JMarsch

+0

@JMarsch是啊 - 如果你使用Encoding.Unicode,它可能會「正常工作」,如果它原來是UTF-8的話。 –

+0

請記住,如果您的「源」MD5是在字符串的utf-8演示文稿中計算的,那麼如果您現在使用utf-16,則會得到不同的MD5。即使您的字符串中只有ASCII字符,情況也是如此。 – brighty

1

你得到一個null退貨原因是string參數爲Create方法speciies的算法,而不是被散列的文本。沒有TextToHash算法,因此你得到null作爲回報。