2010-10-12 42 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();