在没有原始输入的情况下递增 Rfc2898DeriveBytes IterationCount

Incrementing Rfc2898DeriveBytes IterationCount without original input

网上很多Rfc2898DeriveBytes相关的文档都建议每两年增加一次迭代次数。我正在为应用程序设计一个新的数据库结构,以包含每个用户的散列和盐的迭代次数。确保所有密码在两年内更新为新的迭代计数的最佳方法是什么? Rfc2898DeriveBytes 构造函数只接受密码作为输入,不接受哈希。我对编写自己的函数有点谨慎,但是可以选择使用 HMACSHA1 重新散列吗?或者我是否只需要等待所有用户登录并重新散列它们(如果他们有旧的迭代)?

Or do I just need to wait for all users to log in and rehash them if they have the old iterations?

是的,这是正常的解决方案。

你运行函数一旦传入用户提供的密码、保存的盐和保存的迭代计数。一旦您验证哈希值匹配,您就可以将用户拥有的迭代计数与您用于新密码的全局迭代计数进行比较。如果旧计数较低,则您 运行 函数再次使用用户提供的密码、新盐1 和新的更高迭代计数。然后更新为该用户保存的散列、salt 和迭代计数。

要强制执行更新,您只需在服务器上的配置文件中有一个变量,您每两年更改一次。当程序在配置更改后重新启动时,它会加载到您用于新密码的全局迭代计数中。当人们登录时,他们会获得新的迭代计数。


1:不用做新盐,但是做也没什么坏处。