【问题标题】:C# compare hashed password (Pbkdf2)C# 比较散列密码 (Pbkdf2)
【发布时间】:2026-01-01 14:10:01
【问题描述】:

我正在 .Net Core 中开发身份验证。 我有 api 来创建一个带有登录名和密码的用户。

我对密码进行了哈希处理,但我找不到任何方法将哈希密码与用户的新输入进行比较。

我用的是microsoft给出的hash方法:

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/consumer-apis/password-hashing?view=aspnetcore-3.1

    // generate a 128-bit salt using a secure PRNG
        byte[] salt = new byte[128 / 8];
        using (var rng = RandomNumberGenerator.Create())
        {
            rng.GetBytes(salt);
        }

    /// hashed will be stored in the DataBase as password
        string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
            password: password,
            salt: salt,
            prf: KeyDerivationPrf.HMACSHA1,
            iterationCount: 10000,
            numBytesRequested: 256 / 8));

当用户登录时,他会发送登录名和密码。 我不知道如何将此密码与数据库中的哈希密码进行比较?

如果我再次对密码进行哈希处理,它将是一个不同的哈希值,所以这无济于事

有什么建议吗? 我很惊讶我没有找到关于这个的答案:(

谢谢!

【问题讨论】:

  • “如果我再次对密码进行哈希处理,它将是一个不同的哈希值”——这就是问题所在。您需要完全按照您第一次的方式进行散列。这里显然有些不同。
  • *.com/questions/2138429/… 有帮助吗?
  • 您需要存储盐和哈希。然后,当提供密码时,您使用存储的盐重新计算哈希,并将结果与​​存储的哈希进行比较。就是这么简单。
  • 谢谢!这就是解决方案。我将每个帐户的盐存储在数据库中。

标签: c# .net password-hash pbkdf2


【解决方案1】:

UserInout : plaintext ==> 发送到认证服务,

创建帐户:生成盐,用盐对给定的明文密码进行散列,存储在帐户信息中

身份验证:从数据库中的帐户信息中读取哈希,将给定的明文密码与读取的盐进行哈希,并将该哈希与数据库中的哈希进行比较。这是最简单的身份验证方式。

请务必始终使用为每个帐户创建的单独哈希,否则哈希将始终不同并且身份验证将失败。

【讨论】:

  • 这就是解决方案。我将每个帐户的盐存储在数据库中。
  • 确保始终为每个帐户使用相同的哈希 - 不知道您的意思。
  • @jps 您必须为每个帐户保存每个单独的盐。例如 acc1 hast salt "2ae" 和 acc2 hast "jnfs" as salt。您必须为每个帐户存储每个盐以便进一步散列
  • 是的,我理解你写的关于节省盐分的内容,但这不是你在引用的句子中所说的。
  • 完善了我的答案