我正在使用.net 3.5。这里的问题是我似乎无法获得匹配的密码。我曾尝试在两者上使用ComputeHash方法,但它会生成不同的哈希值。因为它们现在是阵列的大小不同。 (显然它们基于相同的字符串)。我做错了什么? (“password”是用户输入的byte []参数)
object dataPassword = database.ExecuteScalar("GetUserPassword", new object[] {userName});
if(dataPassword != null && !(dataPassword is DBNull))
{
SHA1Managed hashProvider = new SHA1Managed();
byte[] hashedPassword = (byte[])dataPassword;
byte[] hash = hashProvider.ComputeHash(password);
result = hashedPassword.Equals(hash);
}
答案 0 :(得分:14)
您无法比较byte[]
。它只是比较参考。您应该使用循环或使用IEnumerable<T>.SequenceEqual
扩展方法:
result = hashedPassword.SequenceEqual(hash);
旧方式(LINQ之前):
static bool ArrayEquals<T>(T[] first, T[] second) {
if (first == null && second == null) return true;
if (first == null || second == null) return false;
if (first.Length != second.Length) return false;
for (int i = 0; i < first.Length; ++i)
if (first[i] != second[i]) return false;
return true;
}
答案 1 :(得分:0)
它可能与编码有关。尝试使用UTF8Encoding
类并使用GetBytes
方法对字符串进行编码。
您还可以查看一组hashing classes I made for password verification at Google Code。
答案 2 :(得分:0)
在两种情况下都打印哈希输入的内容。我的意思是打印byte [],而不是字符串。如果它们匹配,那么散列也应该匹配。我对.net一无所知但也许字符串有不同的编码,比如使用ASCII和另一个UTF-8?