密码哈希和验证不匹配

本文关键字:不匹配 验证 哈希 密码 | 更新日期: 2024-11-06 01:55:16

我正在为 ASP.NET MVC 5编写自定义表单身份验证(不,我不想使用 ASP.NET 身份)。我正在尝试使用随机生成的盐对密码进行哈希处理,然后使用 SHA512 对salt+password进行哈希处理。以下是我编写的方法:

private static User SetPassword(User newUser, string password)
{
    var rand = RNGCryptoServiceProvider.Create();
    var saltBytes = new byte[128];
    var passwordBytes = Encoding.UTF8.GetBytes(password);
    rand.GetNonZeroBytes(saltBytes);
    var passHash = SHA512Managed.Create().ComputeHash(saltBytes.Concat(passwordBytes).ToArray());
    var hash = Encoding.UTF8.GetString(passHash);
    var salt = Encoding.UTF8.GetString(saltBytes);
    newUser.PasswordHash = hash;
    newUser.Salt = salt;
    return newUser;
}
private static bool ValidatePassword(User user, string passwordTry)
{
    var actualPasswordBytes = Encoding.UTF8.GetBytes(user.PasswordHash);
    var passwordTryBytes = Encoding.UTF8.GetBytes(passwordTry);
    var saltBytes = Encoding.UTF8.GetBytes(user.Salt);
    var passwordTryHashBytes = SHA512Managed.Create().ComputeHash(saltBytes.Concat(passwordTryBytes).ToArray());
    if (passwordTryHashBytes == actualPasswordBytes)
    {
        return true;
    }
    return false;
}

如果我逐步完成代码,注册 (SetPassword()) 方法似乎成功工作。用户的记录使用 UTF-8 编码的密码哈希和盐进行设置。

如果我逐步完成密码验证方法,一切似乎也正常运行。根据密码尝试检查用户的记录(盐和哈希)。

问题是,当我使用密码注册,然后尝试以该用户身份登录时,密码验证失败。我可能不明白其中一个密码学类是如何工作的......谁能解释为什么这不起作用?

密码哈希和验证不匹配

以下代码将始终失败,因为两个对象不指向相同的引用:

if (passwordTryHashBytes == actualPasswordBytes)

尝试使用 LINQ 的 SequenceEqual() 方法

passwordTryHashBytes.SequenceEqual(actualPasswordBytes)