2008-10-10 119 views
5

我正試圖在JavaScript和.Net中生成等效的MD5哈希。沒有做過,我決定使用第三方計算 - 這個web site爲「密碼」一詞。我會在鹽添加後,但在那一刻,我不能得到的.NET版本與網站的哈希匹配:爲什麼我的.net計算的MD5哈希值等於在網站上計算的哈希值?

5f4dcc3b5aa765d61d8327deb882cf99 

我猜這是一個編碼的問題,但我已經嘗試了大約8種不同的方法來計算.Net中的MD5散列,並且它們都不符合我在JavaScript中(或從網站上)獲得的內容。這MSDN example是我曾嘗試的方法,這將導致該散列這是我常用收到一個:

7c6a180b36896a0a8c02787eeafb0e4c 

編輯:可悲的是,我不小心被兩個不同的實現提供不同的源字符串。 EBSAK。 : - /仍然有興趣聽到你對後續的回答。

獎金問題:哪種編碼/格式最適合在數據庫中存儲散列值?

+0

你在使用JavaScript散列提供?我要問的原因是,如果是爲了安全起見,它應該只能在服務器上生成。 – 2008-10-10 05:36:10

+0

爲了退出這個討論,我覺得[Thomas Ptacek的帖子](http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you -need-to-know-about-secure-password-schemes.html)(對於[Jeff Atwood post](http://blog.codinghorror.com/rainbow-hash-cracking/)上的類似主題)最好解釋爲什麼你不應該使用任何類似MD5的密碼散列。推薦閱讀。 – 2008-10-10 05:43:49

回答

9

從MSDN網站上運行的代碼,你引用:

// Hash an input string and return the hash as 
    // a 32 character hexadecimal string. 
    static string getMd5Hash(string input) 
    { 
      // Create a new instance of the MD5CryptoServiceProvider object. 
      MD5 md5Hasher = MD5.Create(); 

      // Convert the input string to a byte array and compute the hash. 
      byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)); 

      // Create a new Stringbuilder to collect the bytes 
      // and create a string. 
      StringBuilder sBuilder = new StringBuilder(); 

      // Loop through each byte of the hashed data 
      // and format each one as a hexadecimal string. 
      for (int i = 0; i < data.Length; i++) 
      { 
       sBuilder.Append(data[i].ToString("x2")); 
      } 

      // Return the hexadecimal string. 
      return sBuilder.ToString(); 
     } 


     static void Main(string[] args) 
     { 
      System.Console.WriteLine(getMd5Hash("password")); 
     } 

回報:

5f4dcc3b5aa765d61d8327deb882cf99 
+0

是的。 : - /我在兩個實現中使用了不同的源字符串。白癡! – pc1oad1etter 2008-10-10 05:47:46

0

我得到的值相同網站的「密碼」字:

$ echo -n password | md5 
5f4dcc3b5aa765d61d8327deb882cf99 

沒有看到你實際使用的代碼,它很難說什麼可能會出錯。

至於在數據庫中存儲散列,我將它們存儲爲十六進制字符串。儘管大多數數據庫都可以處理二進制blob,但將它們存儲爲二進制文件只能節省一半的空間,並且很難查詢和操作。無論如何,你正在存儲的數據以及散列的其他數據可能更大。

+0

或者使用Base64,它只將二進制數擴展三分之一,而不是加倍。不是說MD5可以安全地用於密碼哈希。 – 2009-07-08 16:58:56

0

這VB.Net版本給像MySQL從我自己的經驗相同的結果:

Private Function MD5Hash(ByVal str As String) As String 

    Dim md5 As MD5 = MD5CryptoServiceProvider.Create 
    Dim hashed As Byte() = md5.ComputeHash(Encoding.Default.GetBytes(str)) 
    Dim sb As New StringBuilder 

    For i As Integer = 0 To hashed.Length - 1 
     sb.AppendFormat("{0:x2}", hashed(i)) 
    Next 

    Return sb.ToString 

End Function 
0

你有你如何試圖做到這一點任何代碼?

(對第二個Q的響應)我通常使用一個字符串字段並將其存儲爲BASE64編碼。易於使用並進行比較。

/// <summary> 
/// Gets the Base 64 encoded SHA1 hashed password 
/// </summary> 
/// <returns>A Base 64 encoded string representing the SHA1 Hash of the password</returns> 
public string ToBase64SHA1String() 
{ 
    return Convert.ToBase64String(this.GetSHA1HashCode()); 

} 
+0

我已經鏈接到我正在使用的一種方法 - 在帖子中。 – pc1oad1etter 2008-10-10 05:48:19

0

還應當指出的是MD5和可與彩虹表被破解(有在互聯網上的免費程序將接受MD5總和作爲輸入,並將輸出明文 - 通常是密碼)

SHA1可能是更好的選擇...

編輯:加入鹽是爲了防止被你的散列被逆轉的好辦法
編輯2:如果我懶得看了你的帖子我已經注意到,您已經提到過,您打算添加鹽

3

這是發生,因爲你想用哈希password1,而不是password,或者計算錯誤password和它在某種程度上神祕等於password1

你可以做MD5哈希的反向查找你通過谷歌搜索

7c6a180b36896a0a8c02787eeafb0e4c