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

isu*_*ing 6 php hash levenshtein-distance

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

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

所以,我以为我会使用similar_textlevenshtein功能.如果用户必须输入他或她的旧密码,这就有效.

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

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

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

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

Eri*_* J. 9

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

产生排列的规则与不允许相似性的规则相同.

password1
Run Code Online (Sandbox Code Playgroud)

password2
Run Code Online (Sandbox Code Playgroud)

排列

password
password1   // This permutation's hash matches the stored hash.
password3
1password
etc...
Run Code Online (Sandbox Code Playgroud)

  • @AndrewBrown,请考虑删除以上所有评论.其中没有一个是准确的,并且让未来的读者误以为这种方法是错误的.这是正确的答案. (5认同)
  • @AndrewBrown:您生成新密码的所有排列,这些排列会导致它无效,因为它与旧密码太相似,然后对这些排列进行散列以查看它们是否与旧散列匹配.基本上,它是基于规则的反复试验,以确定您是否可以从新密码生成旧密码.对于任何散列函数(假设相同的salt和散列迭代次数),您将始终获得相同的输出散列.否则,您无法使用散列进行身份验证. (4认同)