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

时间:2016-03-28 10:08:56

标签: c# security hash sha

使用sha256和salt的散列密码,我的validate方法总是返回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);
}

但它也让我虚假

1 个答案:

答案 0 :(得分:2)

让我们假设你的密码是"你好"你的名字="测试"。

贮藏

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

检查

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