NIST和OWASP ASVS建议检查密码与从以前的数据破坏中获得的密码。这些密码的列表可以从“300 be Pwned”(https://haveibeenpwned.com/Passwords)下载,但是有超过3亿的pwned密码。您是否建议将用户的密码(注册、更改密码,甚至每一次成功登录)与这么大的列表进行比较?会不会对演出影响太大?
将密码与诸如前1000或10000位最常见的密码(例如https://github.com/danielmiessler/SecLists/tree/master/Passwords )这样的较小列表进行比较是否更好呢?这是来自OWASP ASVS的确切建议。
发布于 2021-04-22 09:19:33
您是否建议将用户的密码(注册、更改密码,甚至每一次成功登录)与这么大的列表进行比较?
为了保证合理的安全性,我建议在注册和更改密码期间,根据10,000个密码的列表检查密码。还阻止包含公司名称、应用程序名称或用户名的密码。
为了进一步提高安全性,您可以增加区块列表的大小。更大的大片更安全,但回报却越来越少。
如果用户已经配置了密码,然后在不相关的数据泄露时公开密码,则登录检查非常有用。这只在您定期更新数据库或使用API接口时才有效。
有关讨论,请参见本ASVS发行。
会不会对演出影响太大?
如果正确实现,在一个有3000万个密码的数据库中查找可以非常快。但是,要实现它比在有10000行的文本文件中查找要困难一些。因此,与其说是服务器执行时间,不如说是开发人员时间的成本。
发布于 2021-04-22 08:43:12
“每一个成功的登录”都是毫无意义的浪费,除非您刚刚实现了密码检查功能,而且以前没有它,在这种情况下,检查每个用户的登录一次可能是有意义的。只有在你添加了一堆新密码之后才会有意义。向身份验证DB中添加一个字段,该字段指示是否对列表检查了每个密码(默认为false),并对每个字段进行一次检查,在字段通过后将其切换为true (不匹配)。那些匹配列表的人会被迫更改它(如果他们拒绝,让他们的字段为false,甚至只是标记帐户“必须更改密码”)。在创建时检查新密码(新用户中的任何一个,或者用户更改或重置它们),一旦它们通过,字段就被设置为true。
pwned密码列表可以通过几种方式进行排序,但是“字母表”(通过字符串比较逻辑)很明显,并且允许极快的查找(二进制搜索)。在数据库表中填充适当的索引,您甚至不必自己编写查找逻辑。不检查所有3亿的内存是没有任何性能原因的;它仅仅是检查10,000次的两倍多(这还不够,真的),对于任何有少量RAM的良好DB引擎来说,这是一个相当容易的任务(给它足够的RAM,整个列都可以保存在RAM中,尽管没有这一点,它也会非常快)。但是,您可能会发现,在某个阈值中,曾经被泄露过的密码仍然是可以容忍的(可能在转储中只看到过一次密码,或者只是看不到百万个最常见的密码,或者其他类似的东西)。不过,最安全的选择肯定是检查它们。
https://security.stackexchange.com/questions/248585
复制相似问题