C# .NET和MySQL中SHA1的区别

C# .NET和MySQL中SHA1的区别,c#,mysql,cryptography,sha1,cryptographic-hash-function,C#,Mysql,Cryptography,Sha1,Cryptographic Hash Function,我有两段不同的代码,但简短的故事是,我使用SHA1将一些密码插入MySQL数据库,并将SHA1哈希计算到.NET中,但它们不匹配。我认为这是我在.NET中的编码代码的问题 SQL代码: INSERT INTO user_credentials (Password) VALUES (SHA1('password')); 密码散列到5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 .NET代码: public static string GetPasswordHas

我有两段不同的代码,但简短的故事是,我使用SHA1将一些密码插入MySQL数据库,并将SHA1哈希计算到.NET中,但它们不匹配。我认为这是我在.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~


感谢您的帮助!

在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 5B-AA-61-E4-C9-B9-3F-3F-06-82-25-0B-6C-F8-33-1B-7E-E6-8F-D8
您需要将
[?a?????%l?3~?
放在十六进制表示中。您正在打印的可能是二进制形式(因此有多个
字符)

尝试这样做:

string hexstring = BitConverter.ToString(hashedPasswordBytes);

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

您的MySQL表/数据库是如何编码的?尝试将两者都设置为UTF-8(因此使用Encoding.UTF8.GetBytes)

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

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

以下内容将为您提供与MySQL产品完全匹配的内容:

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

完美。需要转换为lower并删除-。
string hex=BitConverter.ToString(hashedPasswordBytes)。替换(“-”,”)。为了避免令人讨厌的冗余
Replace()
,我在我的Windows 8应用程序中使用此解决方案: