C#:在验证用户时,将密码哈希值与用户输入的不同大小进行比较

时间:2012-01-17 07:13:35

标签: c# authentication hash passwords salt

我已经进行了用户注册,我已使用SHA256对用户密码进行了盐化并对其进行了哈希处理。 之后,当用户需要登录我的系统时,我需要将他的密码保存并进行哈希处理,所以我: 1.从数据库中检索盐“字符串” 2.将盐转换为字节 3.创建一个新的byte [] = [inputPassword.length + salt.length] 并且散布了那个。

现在新散列比原始散列短......(使用相同的散列函数)

鉴于这些信息您认为问题可能是什么...... 将salt作为CHAR存储在我的数据库中是错误的,如果是,我应该保存什么或如何保存它?

注意:两个哈希值都在字节级别进行比较。 注意:所有用户信息都存储在数据库密码中,盐存储为CHAR

提前谢谢

2 个答案:

答案 0 :(得分:1)

您可以从Guid转换为base 64字符串生成salt,然后将其作为char保存在数据库中。我使用nvarchar来使用.NET字符串最大化我的选项。

然后你可以实现类似的东西来生成原始密码哈希,并在用户登录时比较哈希:

    public static byte[] GetHash(string password, string salt)
    {
        byte[] unhashedBytes = Encoding.Unicode.GetBytes(String.Concat(salt, password));

        SHA256Managed sha256 = new SHA256Managed();
        byte[] hashedBytes = sha256.ComputeHash(unhashedBytes);

        return hashedBytes;
    }

    public static bool CompareHash(string attemptedPassword, byte[] hash, string salt)
    {
        string base64Hash = Convert.ToBase64String(hash);
        string base64AttemptedHash = Convert.ToBase64String(GetHash(attemptedPassword, salt));

        return base64Hash == base64AttemptedHash;
    }

答案 1 :(得分:1)

通常哈希函数返回固定大小的哈希,所以如果你告诉新哈希更短,我认为问题可能在你的哈希函数中。