C# 使用哈希密码进行身份验证时始终返回false

C# 使用哈希密码进行身份验证时始终返回false,c#,security,hash,sha,C#,Security,Hash,Sha,使用sha256和salt对密码进行哈希处理时,我的验证方法总是返回false。在调试时,我注意到在返回时,它会将前32位数组与64位数组进行比较。我不知道我哪里做错了 public static byte[] Hash(string value, byte[] salt) { salt = new byte[64]; using (var rng = new RNGCryptoServiceProvider()) {

使用sha256和salt对密码进行哈希处理时,我的验证方法总是返回false。在调试时,我注意到在返回时,它会将前32位数组与64位数组进行比较。我不知道我哪里做错了

    public static byte[] Hash(string value, byte[] salt)
    {
        salt = new byte[64];
        using (var rng = new RNGCryptoServiceProvider())
        {
            rng.GetBytes(salt);
        }
        return Hash(Encoding.UTF8.GetBytes(value), salt);
    }

    public static byte[] Hash(byte[] value, byte[] salt)
    {
        var saltedValue = value.Concat(salt).ToArray();

        return new SHA256Managed().ComputeHash(saltedValue);
    }

    public bool ConfirmPassword(string password)
    {
        var passwordSalt = new byte[64];
        using (var context = new DbConnection())
        {
            context.Connection.Open();
            context.SqlCommand.Connection = context.Connection;

            context.SqlCommand.CommandText = "select salt from users where name='test'";
            var reader = context.SqlCommand.ExecuteReader();
            while (reader.Read())
            {
                passwordSalt = reader["salt"] as byte[];
            }
        }
        var passwordHash = Hash(password, passwordSalt);

        return passwordHash.SequenceEqual(passwordSalt);
    }
更新 所以如果我做对了:

public bool ConfirmPassword(string password)
{
    var userSalt = new byte[64];
    var temp = new byte[64];
    using (var context = new DbConnection())
    {
        context.Connection.Open();
        context.SqlCommand.Connection = context.Connection;

        context.SqlCommand.CommandText = "select password from users where name='test'";
        var reader = context.SqlCommand.ExecuteReader();
        while (reader.Read())
        {
            temp = reader["password"] as byte[];
        }
    }
    var passwordHash = Hash(password, userSalt);

    return passwordHash.SequenceEqual(temp);
}

但它也会返回false

让我们假设您的密码是“Hello”和name=“test”

储存 你需要生成一个随机的盐。然后,您可以将salt和普通密码(“Hello”)与哈希函数一起使用。要立即将结果保存到数据库中,您必须存储生成的salt和哈希密码

检查
从数据库加载salt和hash密码。再次使用散列函数和用户输入(要检查的普通密码)以及数据库中的salt。之后,您可以将结果与数据库中的哈希密码进行比较。就这样…

让我们假设您的密码是“Hello”和name=“test”

储存 你需要生成一个随机的盐。然后,您可以将salt和普通密码(“Hello”)与哈希函数一起使用。要立即将结果保存到数据库中,您必须存储生成的salt和哈希密码

检查
从数据库加载salt和hash密码。再次使用散列函数和用户输入(要检查的普通密码)以及数据库中的salt。之后,您可以将结果与数据库中的哈希密码进行比较。就这样…

您将salt与哈希密码进行比较。这显然总是不同的。@MarkoJuvančič,我需要将数据库中的哈希密码与输入的哈希密码进行比较?您必须从数据库中获取ta哈希密码。您只读的“salt”值(稍后用作对新密码进行哈希运算的salt)在哪里设置userSalt?它是否与用于存储密码的函数相同?SHA256是一个安全的哈希函数,但它不是为密码验证而设计的。密码验证应该很慢,而SHA256很快。请阅读,其中有关于“修复”ASP.NET密码哈希的部分。该部分告诉您确切的操作方法。您可以将salt与哈希密码进行比较。这显然总是不同的。@MarkoJuvančič,我需要将数据库中的哈希密码与输入的哈希密码进行比较?您必须从数据库中获取ta哈希密码。您只读的“salt”值(稍后用作对新密码进行哈希运算的salt)在哪里设置userSalt?它是否与用于存储密码的函数相同?SHA256是一个安全的哈希函数,但它不是为密码验证而设计的。密码验证应该很慢,而SHA256很快。请阅读,其中有关于“修复”ASP.NET密码哈希的部分。那部分告诉你该做什么。