【发布时间】:2022-01-05 15:47:21
【问题描述】:
我想增加现有密码的迭代次数。 Rfc2898DeriveBytes 可以吗?我的微弱尝试显然不起作用:
class Program
{
static void Main(string[] args)
{
byte[] salt = new byte[16];
using (var c = new RNGCryptoServiceProvider())
{
c.GetBytes(salt);
}
byte[] password = Encoding.UTF8.GetBytes("password");
const int currentIterationCount = 100;
const int newIterationCount = 1000;
byte[] partialHash = Compute(password, salt, currentIterationCount, 32);
byte[] finalHash = Compute(partialHash, salt, newIterationCount - currentIterationCount, 32);
byte[] onetimeHash = Compute(password, salt, newIterationCount, 32);
Console.WriteLine(Convert.ToBase64String(finalHash)); // N2HOBoubZfcOV9my3SIH8+KH9khvtCUSoRDDWkJJpMg=
Console.WriteLine(Convert.ToBase64String(onetimeHash)); // EnBixdGRX+Y6P1qNcKGYrbzxusn3b4Yvo3Shw7/8L7Y=
Console.WriteLine(finalHash == onetimeHash); // False
Console.ReadKey(true);
}
private static byte[] Compute(byte[] valueToHash, byte[] salt, int iterations, int hashSize)
{
using (var pbkdf2 = new Rfc2898DeriveBytes(valueToHash, salt, iterations))
{
return pbkdf2.GetBytes(hashSize);
}
}
}
我目前也仅限于 .net standard 2.0/.net framework 4.7.2
【问题讨论】:
-
您必须等到用户再次登录,以便您拥有密码,然后您可以创建具有更多迭代的哈希并将其存储。您必须在数据库中记录哈希使用了多少次迭代,并检查它是否是所需的值。