如何告诉我的用户他们输入了旧密码?

How can I tell my users that they've entered an old password?

阅读this question on SO Security后,我一直在想如何实现这样的功能。

我目前正在用户 table

中存储密码
ID  | Email         | Pswd
------------------------------------------
1   | bob@no.domain | Argon2ID hash salted

所以我需要某种 password_history table。

UID |  Pswd                  | Date                | IP
-------------------------------------------------------------------
1   |  Argon2ID hash salted  | 1454-01-05 21:18:01 | 127.0.0.1

如果用户密码与当前密码不匹配,检索所有旧密码并验证所有密码。

这可能需要一些时间,因为 Argon2ID 密码验证需要大约 160 毫秒,具体取决于服务器。

10 个旧密码 x 160 毫秒 = 仅验证 1600 毫秒

这个方法好像效率不高。我该如何实现?

  1. 测试较少的密码。此功能的大部分价值来自于测试最近的 1 或 2 个密码,或者最近的一个和一个更早以前的密码。超出此范围的测试对用户的价值微乎其微,并可能使他们面临更多风险。

  2. 稍微降低密码哈希的强度。 160 毫秒的密码哈希过长,可能会使您的服务器因多次分布式登录尝试而面临拒绝服务的风险。