随着时间的推移增加哈希函数的工作因子

信息安全 哈希 bcrypt pbkdf2
2021-08-31 22:55:50

长期以来,散列函数需要一个工作因素,以保持操作“足够慢”以在数据库泄漏的情况下保护个人密码。Bcrypt 和 PBKDF2 是值得注意的例子。

在安全性方面,我也知道“不要自己动手”,但很容易想象这样一种情况,随着时间的推移,由于硬件增加,密码散列方案的工作因素变得过快。人们还可以想象这样一种情况,数据库所有者升级他们自己的硬件,因此与硬件升级之前使用的相比,更高的工作因数是合适的,以确保每个密码更好的安全性。

问题在于必须“重新散列”密码,因为您不想在数据库中存储明文甚至加密密码,因此系统无法再次访问密码以重新散列以更改工作因素. 要解决这个问题,只需在用户登录时重新进行哈希处理。每当用户登录时,系统已经可以使用他们的明文密码,在密码的成功哈希验证后,系统可以检查与之前关联的工作因素密码的哈希值(在 bcrypt 中很容易做到),如果它小于系统操作员选择的标准工作因子,那么明文密码将被重新哈希并与新的工作因子和新盐一起存储。会话不需要重置,因为使用的密码和以前一样,只是不同的工作因素和盐。

除了在密码验证过程中明文密码在内存中的时间稍长以及每当发布工作因子增加时验证密码的时间增加之外,我找不到该模型的任何故障。有没有我遗漏的安全漏洞?

2个回答

你似乎总结得很好。

我能想到的唯一缺点是您系统中的非活动用户 - 他们将继续拥有以前的工作因素,因为他们可能永远不会再次登录,或者在您下一次违规之前可能没有机会登录,这意味着他们存储的密码更多容易受到攻击。由于工作因素在存储的数据中是可见的,因此攻击者会知道哪些人正在使用旧设置(尽管他们不会知道每个密码中的相对熵)。

为防止这种情况发生,您可以定期禁用 6 个月未登录的帐户,同时清除其密码。如果他们以后需要登录,他们可以简单地通过您忘记密码的功能来设置新密码并将其与新的工作因素一起存储。

关键点是您的数据库中有密码散列,因此您不必重新散列密码。假设您已经将它们散列(正确地,使用盐等)N 次。为了使您的工作因素加倍,您可以在数据库中重新散列 N 次。然后将相同的重新哈希应用于将来的登录。请参阅https://crypto.stackexchange.com/questions/3003/do-i-have-to-recompute-all-hashes-if-i-change-the-work-factor-in-bcrypt是否有可能增加BCrypt 或 PBKDF2 的成本在已经计算且没有原始密码的情况下?更多细节。