.NET和MySQL中SHA1的差异

9

我有几段不同的代码,但简单来说,我使用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~???

感谢任何帮助!


我在我的Windows 8应用程序中使用了这个解决方案:http://stackoverflow.com/questions/17832306/simulating-mysqls-password-encryption-using-net-in-windows-8/ - Ricardo
5个回答

16

在MySQL的示例中,你将字符串编码为十六进制,而在.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
完美的。需要转换为小写并删除横杠。 - Luke Belbina
3
string hex = BitConverter.ToString(hashedPasswordBytes).Replace("-", "").ToLower - Endy Tjahjono

3

您需要将[?a??????%l?3~???转换为十六进制表示。您打印的内容可能是二进制形式(因此出现了多个?字符)。

请尝试执行以下操作:

string hexstring = BitConverter.ToString(hashedPasswordBytes);

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


2
以下内容将为您提供与MySQL生成的精确匹配:
 BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Password))).Replace("-", "").ToLower();

1

SHA1哈希值应该相等,但是表示不同。MySql输出十六进制字符串,因此您需要在.NET中执行相同的操作:

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

1
+manymany 可以避免那些令人讨厌的冗余 Replace() - vines

0
你的MySQL表/数据库采用什么编码方式?尝试将两者都设置为UTF-8(因此使用Encoding.UTF8.GetBytes)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接