【发布时间】:2018-11-05 03:57:53
【问题描述】:
看了this question on SO Security之后,我一直在想我该如何实现这样的功能。
我目前将密码存储在用户表中
ID | Email | Pswd
------------------------------------------
1 | bob@no.domain | Argon2ID hash salted
所以我需要一个password_history 某种形式的表。
UID | Pswd | Date | IP
-------------------------------------------------------------------
1 | Argon2ID hash salted | 1454-01-05 21:18:01 | 127.0.0.1
如果用户的密码与当前密码不匹配,则检索所有旧密码并验证所有密码。
这可能需要一些时间,因为 Argon2ID 密码验证需要大约 160 毫秒,具体取决于服务器。
10 个旧密码 x 160 毫秒 = 1600 毫秒的验证时间
这种方法似乎效率低下。我该如何实现呢?
【问题讨论】:
-
您想存储所有用户的旧密码吗?我会说您可以更改对旧密码使用更少时间的加密方法。当用户更改为新密码时,您可以从用户那里获取旧密码。
-
如果您担心安全性,存储所有用户密码实际上不是一个好主意。也许只存储最后两个密码就足够了。您可以在用户表中再添加两列并丢弃密码历史记录表。
-
您 100% 不应阻止用户使用旧密码,也不应警告用户重复使用密码。这种警告的最初概念来自一个世界,在这个世界中,安全人员将密码过期视为一种好的做法(现在已知是错误的),并假设用户就像具有完美记忆的计算机。这个世界现在被认为是虚构的,2003 年的旧 NIST 指南已被抛弃,以取代有利于用户的新指南。不要将烦人与安全混为一谈。
-
@kks21199 不,您不能对旧密码使用较弱的加密格式!它们与当前密码一样敏感。
-
@duskwuff 我的意思是存储两个与主密码具有相同加密的密码,但我个人认为不必存储旧密码并承担更多保护它们的责任。跨度>