我有几个不同的代码,但简短的故事是我使用SHA1将一些密码插入到MySQL数据库中,并且还计算到.NET中的SHA1哈希值并且它们不匹配。我认为这是我在.NET中的编码代码的问题。
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 :(得分: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 :(得分:3)
您需要将[?a??????%l?3~???
置于 HEX 表示中。你打印的内容可能是二进制形式(因此有多个?
字符。)
尝试这样做:
string hexstring = BitConverter.ToString(hashedPasswordBytes);
看看hexstring
和MySQL哈希是否匹配。
答案 2 :(得分:2)
以下内容将为您提供与MySQL产生的完全匹配:
BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Password))).Replace("-", "").ToLower();
答案 3 :(得分:1)
SHA1哈希应该相等,但表示不是。 MySql输出一个十六进制字符串,因此您需要在.NET中执行相同的操作:
return String.Join(String.Empty, hashedPasswordBytes.Select(b => b.ToString("x2")))
答案 4 :(得分:0)
您的MySQL表/数据库是如何编码的?尝试将两者都设置为UTF-8(因此使用Encoding.UTF8.GetBytes)