【问题标题】:Pbkdf2 How to verify hashed password?Pbkdf2 如何验证散列密码?
【发布时间】:2020-02-29 18:17:33
【问题描述】:

我正在使用以下代码使用 Pbkdf2 对密码进行哈希处理:

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

            // derive a 256-bit subkey (use HMACSHA1 with 10,000 iterations)
            string hashedPassword = Convert.ToBase64String(KeyDerivation.Pbkdf2(
                password: password,
                salt: salt,
                prf: KeyDerivationPrf.HMACSHA1,
                iterationCount: 10000,
                numBytesRequested: 256 / 8));

            return hashedPassword;
        }

如何验证密码以进行身份​​验证?看来我需要获取用于散列密码的盐。我怎么得到它?请注意,我没有使用单独的字段来存储哈希。数据库中仅存储散列密码。

【问题讨论】:

  • 正常的方法是在哈希前面加上盐,然后将整个东西存储在数据库中。当你来验证某人时,将盐从哈希中分离出来。添加 1) 使用的哈希算法的标识符,2) 迭代次数也很常见,因此您可以在将来更改这些内容,同时保持向后兼容性。
  • 如何分开这些?我可以使用点 (.) 之类的东西吗?如果哈希包含一个点怎么办?
  • 一种方法是将盐和哈希编码为十六进制或base64字符串,并使用非base-64字符,例如美元符号$或冒号:作为分隔符。见bcrypt for example
  • @canton7 非常感谢。在阅读了许多教程后,我无法弄清楚这一点。
  • 您接受将盐存储到数据库吗?由于盐是随机生成的,您需要将其存储在数据库中,然后您才能验证密码。

标签: c# asp.net asp.net-core password-hash pbkdf2


【解决方案1】:

一种可能的替代方法是通过以下方式使用 Microsoft.AspNet.Identity 中的 PasswordHasher

var passwordHasher = new PasswordHasher();
var pass = "password";
var hash = passwordHasher.HashPassword(pass);
var isVerified = passwordHasher.VerifyHashedPassword(hash, pass) 
              != PasswordVerificationResult.Failed;
Console.WriteLine((isVerified ? "Verified" : "Not verified"));

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 1970-01-01
    • 2014-10-20
    • 2020-10-05
    • 1970-01-01
    • 2016-01-13
    • 2019-05-24
    • 1970-01-01
    • 2016-12-17
    相关资源
    最近更新 更多