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

标签 c# authentication hash passwords salt

我已经进行了用户注册,我在其中添加了用户密码并使用 SHA256 对其进行了哈希处理。 稍后,当用户需要登录我的系统时,我需要对他的密码进行加盐和哈希处理,所以我: 1.从数据库中检索盐“字符串” 2.将salt转换成bytes 3. 创建一个新的 byte[] = [inputPassword.length + salt.length] 4. 并对其进行哈希处理。

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

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

注意:两个哈希值都是在字节级别进行比较的。 注:所有用户信息都以CHAR形式保存在数据库中password和salt

提前谢谢你

最佳答案

您可以从转换为 base 64 字符串的 Guid 生成盐,然后将其作为 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;
    }

关于C#:在对用户进行身份验证时,将密码哈希与用户输入的不同大小进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8890902/

相关文章:

c# - 使用C#执行Powershell命令(azureVM)

c# - 在字符串列表中查找与输入字符串最接近的匹配项

java - 登录时在 spring security 中更改用户名

unix - 密码保护普罗米修斯访问

c# - 我是否正确回答了这个面试挑战? (在 C# 中检查有效的二叉树)

authentication - Facebook 登录按钮未显示

ios - iOS通过UIImage的像素比较来检索像素中的不同像素

ruby - 将数组转换为哈希,同时删除重复键和添加值

ruby - 具有可选的第一个哈希参数和 keyword_args 的奇怪方法行为

c# - 抑制解决方案级别的警告。在解决方案级别将警告视为错误