【问题标题】:Is it possible or how to compute additional iterations in C# Rfc2898DeriveBytes是否有可能或如何在 C# Rfc2898DeriveBytes 中计算额外的迭代
【发布时间】: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

【问题讨论】:

  • 您必须等到用户再次登录,以便您拥有密码,然后您可以创建具有更多迭代的哈希并将其存储。您必须在数据库中记录哈希使用了多少次迭代,并检查它是否是所需的值。

标签: c# pbkdf2


【解决方案1】:

您无法在不知道密码的情况下增加轮数,因为在每一轮 PBKDF2-HMAC-SHA1 都会计算 HMAC-SHA1(password, H),其中 H 是上一轮 HMAC-SHA1 的输出。

因此,一个常见的解决方案是从数据库中删除所有旧密码并要求用户创建新密码。

此外,正如 Andrew Morton 所建议的,当用户登录时,可以在短时间内动态创建新的哈希值。

无论如何,如今 1000 次的迭代次数并不多。如果您负担得起,您应该使用更高的值。您还应该考虑改用更好的密码散列函数,例如 Argon2id。

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2021-12-20
    • 1970-01-01
    • 2016-01-17
    • 2011-01-18
    相关资源
    最近更新 更多