公司如何判断我的密码是否与之前的 5 个密码相似?

信息安全 密码 密码管理
2021-08-30 16:54:19

密切相关(但不重复):公司可以判断新密码和旧密码是否过于相似。有安全问题吗?

也密切相关(但不重复):系统如何在不以明文形式存储或处理旧密码的情况下强制密码中更改字符的最小数量?

一家特定的公司(我不会说是哪家)要求我的密码与之前的 5 个密码中的任何一个都不相似。

根据链接的问题,当他们检查您的密码是否与前一个密码过于相似时,他们只会强迫您同时输入旧密码和新密码并进行比较。我理解这一点,并且似乎没有任何安全问题。

但是,有问题的公司实际上将我的密码与之前的 5 个密码进行了比较,我没有输入任何密码。他们怎么可能这样做?我应该将此作为证据,证明他们要么以明文形式存储我的密码,要么他们使用了非常弱的散列函数,还是有一种合法的方式可以做到这一点而不会泄露我的密码?

第二个链接问题中的链接答案简要地暗示了这个问题,但并没有真正完全解决他们可能如何做到这一点或它有多大的安全问题。

3个回答

可以通过多种方式完成:

  1. 保留最近使用的五个密码的列表,希望是加密的。显然不是最安全的事情,但肯定是可行的。
  2. 保留与最后五个密码相关的哈希列表,例如完整密码、前 X 个字符、最后 Y 个字符
  3. 保留最后五个密码的特征模式列表,例如 llllllllds。l 是字母,d 是数字,s 是特殊字符。如果模式相同,但散列不同,那么它太接近了。

更改后,他们可以存储旧密码的明文或加密版本。您说您必须提供以前的密码,该密码在更改时显然可用。一旦更改,它可以以允许比较的方式存储。

对于某些“正确”值,它有可能“正确”完成。例如,如果您在其他网站上重复使用这些密码中的任何一个,那仍然不好。

他们可以做到这一点,即使他们所拥有的只是来自以前密码的适当的强散列,只要他们的“相似”概念足够狭窄。获取新密码并列举他们认为相似的所有密码。对于每个变体,使用每个先前密码的盐计算哈希。如果有P个以前的密码和N个相似的密码,则成本是P × N哈希计算。如果它们有足够的硬件,这些计算可能会并行执行,因此从进行验证所需的时间起,您无法知道它们执行了多少哈希计算。

5 × N很快变大。例如,仅尝试对不区分大小写的 8 个字母密码的所有单字母变体进行 1000 次计算。但是通过诸如仅改变数字(例如swordfish5swordfish4)或删除重复字母(例如swordfishhswordfish)之类的启发式方法,数字可以保持可控。

他们可以作弊的一种温和方式是始终为给定帐户使用相同的盐。那么尝试变体的成本与先前密码的数量无关。在同一帐户上更改密码后重用相同的盐会立即显示两个密码是否相同,但除此之外它不会使攻击更容易。