当用户创建密码时,我将其哈希(包括盐)并将其保存在数据库中。
现在,当用户想要更改他或她的密码时,我想测试新密码是否与旧密码太相似(我已经在不同的服务上看到了这一点,特别是网上银行)。
所以,我想我会使用similar_text
或levenshtein
函数。如果用户必须输入他或她的旧密码,这就有效。
但是当用户忘记密码并且需要重置密码时,显然不必输入旧密码。所以我需要将新密码与旧密码(保存在数据库中)进行比较,我没有明文但是哈希。
现在,当我使用相同的盐散列新密码,并将其与旧密码(散列)进行比较时,我显然无法测试新密码和旧密码是否相似。
我很想知道公司如何做到这一点,当他们不将密码保存为数据库中的纯文本时?
我在Google上找不到任何有用的东西。如果有人有任何建议或链接到更详细讨论这个问题的文章,我会很感激,如果他们可以分享它们。
答案 0 :(得分:9)
如果存储的密码被散列(而不是加密),则测试相似性的一种方法是生成新密码的许多可能排列,对排列进行散列,并查看这些散列中的任何散列是否对应于存储的散列。
生成排列的规则与不允许相似性的规则相同。
<强> OLD 强>
password1
新强>
password2
<强>排列强>
password
password1 // This permutation's hash matches the stored hash.
password3
1password
etc...
答案 1 :(得分:1)
在散列两个几乎相同的字符串之后(让我们说一点点不同)将具有完全不同的散列...并且两个完全不同的字符串可能具有相似的散列。
使用密码哈希或加密时,无法检查密码相似性。您只能检查密码是否相等。
另外,您不应该恢复旧密码。策略是用户应该在他不记得旧密码时始终创建一个新密码。如果你允许他们恢复/猜测他们的密码,你也会帮助攻击者破解用户密码。
答案 2 :(得分:0)
在生成新密码时,人们通常会为密码创建一个随机字符串并将其发送给用户(通过电子邮件或短信或其他任何方式),并将该字符串哈希并将散列密码保存在数据库中。
您不需要恢复OLD密码。像md5()
这样的删除方法无法解密或恢复,这就是我们使用它们的原因,以避免被黑客解密。