如何测试两个哈希值(密码)是否相似?

时间:2014-01-09 21:35:03

标签: php hash levenshtein-distance

当用户创建密码时,我将其哈希(包括盐)并将其保存在数据库中。

现在,当用户想要更改他或她的密码时,我想测试新密码是否与旧密码太相似(我已经在不同的服务上看到了这一点,特别是网上银行)。

所以,我想我会使用similar_textlevenshtein函数。如果用户必须输入他或她的旧密码,这就有效。

但是当用户忘记密码并且需要重置密码时,显然不必输入旧密码。所以我需要将新密码与旧密码(保存在数据库中)进行比较,我没有明文但是哈希。

现在,当我使用相同的盐散列新密码,并将其与旧密码(散列)进行比较时,我显然无法测试新密码和旧密码是否相似。

我很想知道公司如何做到这一点,当他们不将密码保存为数据库中的纯文本时?

我在Google上找不到任何有用的东西。如果有人有任何建议或链接到更详细讨论这个问题的文章,我会很感激,如果他们可以分享它们。

3 个答案:

答案 0 :(得分:9)

如果存储的密码被散列(而不是加密),则测试相似性的一种方法是生成新密码的许多可能排列,对排列进行散列,并查看这些散列中的任何散列是否对应于存储的散列。

生成排列的规则与不允许相似性的规则相同。

<强> OLD

password1

password2

<强>排列

password
password1   // This permutation's hash matches the stored hash.
password3
1password
etc...

答案 1 :(得分:1)

在散列两个几乎相同的字符串之后(让我们说一点点不同)将具有完全不同的散列...并且两个完全不同的字符串可能具有相似的散列。

使用密码哈希或加密时,无法检查密码相似性。您只能检查密码是否相等。

另外,您不应该恢复旧密码。策略是用户应该在他不记得旧密码时始终创建一个新密码。如果你允许他们恢复/猜测他们的密码,你也会帮助攻击者破解用户密码。

答案 2 :(得分:0)

在生成新密码时,人们通常会为密码创建一个随机字符串并将其发送给用户(通过电子邮件或短信或其他任何方式),并将该字符串哈希并将散列密码保存在数据库中。

您不需要恢复OLD密码。像md5()这样的删除方法无法解密或恢复,这就是我们使用它们的原因,以避免被黑客解密。