如何存储密码历史记录以防止重复使用?

信息安全 哈希 密码管理 密码策略
2021-08-25 01:51:27

我有一个带有用户数据库的应用程序。数据库使用带有随机盐的 bcrypt 哈希存储密码。

在这种情况下,如何实现密码历史记录集(以防止密码重用)?

如果我有传统的 3 字段密码重置(输入当前密码,输入新密码,确认新密码),我可以存储当前密码,因为我用新密码替换旧密码。但是,后来我有忘记密码的情况。我的用户可以去进行自​​助服务自动重置并一遍又一遍地重复使用他们的密码。

存储的密码将被加密,但可逆加密使它们的安全性降低。

3个回答

存储旧的盐值和哈希值。用任何旧盐对新输入进行散列,看看它们是否匹配。

如果在正常登录时检查密码有效,那么检查密码是否以前使用过也有效。

如果password1 = password2,那么hash(password1, salt1) = hash(password2, salt1)

换句话说:

  • 使用相同的盐和迭代次数对新密码进行 Bcrypt。

  • 比较哈希值。

  • 如果新散列与旧散列不同,则一切正常(根据您的标准),您可以简单地使用新的唯一盐重新散列新密码并将其存储在数据库中。

  • 如果新哈希相同,则新密码与旧密码相同。告诉您的用户选择一个新的。

我的用户可以去进行自​​助服务自动重置并一遍又一遍地重复使用他们的密码。

要解决原始问题中提出的这个问题,您必须存储的不仅仅是最后一个密码。这可以通过存储以前的n盐和哈希来轻松完成。但是,这可能不是一个好主意

改善这种情况的一种方法是存储类似的密码,除了实际密码。

另一种方法是只存储部分 hash

当然,您可以同时使用这两种方法。