【问题标题】:How can I tell my users that they've entered an old password?如何告诉我的用户他们输入了旧密码?
【发布时间】: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 我的意思是存储两个与主密码具有相同加密的密码,但我个人认为不必存储旧密码并承担更多保护它们的责任。跨度>

标签: security passwords


【解决方案1】:
  1. 测试更少的密码。此功能的大部分价值可能来自测试最近的 1 或 2 个密码,或者可能是最近的一个和一个很久以前的密码。超出此范围的测试对用户的价值微乎其微,并可能使他们面临更多风险。

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

【讨论】:

    猜你喜欢
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2020-09-26
    • 2021-10-28
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    相关资源
    最近更新 更多