使用散列密码进行身份验证时始终 return false

Always return false on authentication with hashed password

使用 sha256 和 salt 对密码进行哈希处理时,我的验证方法总是 return 错误。在调试时我注意到在 return 上它将前 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);
}

但它也return我是假的

假设您的密码是 "Hello" 并且您的姓名="test".

存储

您需要生成随机盐。比您可以将盐和纯密码 ("Hello") 与您的哈希函数一起使用。现在要将结果保存在您的数据库中,您必须 存储生成的盐和散列密码。

正在检查

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