我有几个不同的代码,但短篇小说是我使用SHA1将一些密码插入MySQL数据库中,并将SHA1 Hashhes计算到.NET中,并且它们不匹配。我认为这是我在.NET中的编码代码的问题。

SQL代码:

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

密码哈希至5BAA61E4C9B9B93F3F068225550B6CF8331B7EE68FD8

.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

其他提示

你需要放 [?a??????%l?3~???十六进制 表示。您的打印可能是二进制形式(因此多个 ? 字符)。

尝试这样做:

string hexstring = BitConverter.ToString(hashedPasswordBytes);

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

以下将使您与MySQL产生的完全匹配:

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

sha1哈希应该相等,但表示不是。 MySQL输出十六进制,因此您需要在.NET中进行相同的操作:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top