C# 密码散列和验证don';不匹配

C# 密码散列和验证don';不匹配,c#,asp.net,hash,cryptography,passwords,C#,Asp.net,Hash,Cryptography,Passwords,我正在为ASP.NET MVC 5编写自定义表单身份验证(不,我不想使用ASP.NET标识)。我正在尝试使用随机生成的salt对密码进行散列,然后使用SHA512对salt+密码进行散列。以下是我编写的方法: private static User SetPassword(User newUser, string password) { var rand = RNGCryptoServiceProvider.Create(); var saltBytes = new byte[1

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

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编码的密码散列和salt进行设置

如果我一步一步地通过密码验证方法,一切似乎都正常运行。根据密码try检查用户记录(salt和hash)


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

以下代码总是会失败,因为两个对象不指向相同的引用:

if (passwordTryHashBytes == actualPasswordBytes)
尝试使用LINQ的
SequenceEqual()
方法

passwordTryHashBytes.SequenceEqual(actualPasswordBytes)

啊,就是这样!我忘了数组是引用类型。谢谢对于其他使用此代码的人:我用一个简单的字节到十六进制的转换来切换UTF8编码。它最终变得更稳定,更容易调试。