2010-10-12 51 views
9

我有幾個不同的代碼位,但簡短的故事是我使用SHA1將一些密碼插入到MySQL數據庫中,並計算到.NET中的SHA1哈希,並且它們不匹配。我認爲這是我用.NET編碼的問題。.NET和MySQL中SHA1的區別

SQL代碼:

INSERT INTO user_credentials (Password) VALUES (SHA1('password')); 

密碼哈希以5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

.NET代碼:??

public static string GetPasswordHash(string password) 
{ 
    // problem here with encoding? 
    byte[] byteArray = Encoding.ASCII.GetBytes(password); 

    SHA1 sha = new SHA1CryptoServiceProvider(); 
    byte[] hashedPasswordBytes = sha.ComputeHash(byteArray); 

    return Encoding.ASCII.GetString(hashedPasswordBytes); 
} 

密碼哈希爲[A ??????%L 3〜 ???

感謝您的幫助!

+0

我用這解決方案在我的Windows 8應用程序:http://stackoverflow.com/questions/17832306/simulating-mysqls-password-encryption-using-net-in-windows-8/ – Rincha 2013-07-25 09:34:41

回答

15

在MySQL示例中,您編碼爲hexadecimal字符串,在.NET示例中,您使用ASCII編碼。這兩種編碼是不一樣的。

如果您轉換爲十六進制的.NET版本,你得到正確的結果:

string hex = BitConverter.ToString(hashedPasswordBytes); 

結果:

 
5B-AA-61-E4-C9-B9-3F-3F-06-82-25-0B-6C-F8-33-1B-7E-E6-8F-D8 
+1

完美。需要轉換爲較低和刪除的。 – 2010-10-12 19:10:02

+3

'string hex = BitConverter.ToString(hashedPasswordBytes).Replace(「 - 」,「」).ToLower' – 2011-10-26 07:06:48

3

你需要把[?a??????%l?3~???HEX表示。您打印的內容可能是二進制形式(因此爲多個?字符)。

嘗試這樣做:

string hexstring = BitConverter.ToString(hashedPasswordBytes); 

看看是否hexstring和MySQL哈希匹配。

0

你的MySQL表/數據庫是如何編碼的?嘗試設置爲UTF-8(因此使用Encoding.UTF8.GetBytes)

1

SHA1哈希值應該相等,但表示形式不是。它輸出一個十六進制字符串,所以你需要做相同的.NET:

return String.Join(String.Empty, hashedPasswordBytes.Select(b => b.ToString("x2"))) 
+1

+ manymany用於避免冗餘的Replace()事物! – vines 2012-06-15 11:01:49

2

下面會給你一個精確匹配到什麼MySQL的產生:

BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Password))).Replace("-", "").ToLower();