【发布时间】: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