比较哈希密码

时间:2009-06-12 08:46:36

标签: c# .net

我正在使用.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);

}

3 个答案:

答案 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?