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

6
当用户创建密码时,我会将其哈希(包括盐)并保存在数据库中。
现在当用户想要更改他或她的密码时,我想测试新密码是否与旧密码太相似(我在不同的服务上看到过这样的操作,尤其是在线银行)。
所以,我想使用 similar_text 或 levenshtein 函数。如果用户必须输入旧密码,则可以使用该方法。
但是当用户忘记密码并需要重置密码时,显然不需要输入旧密码。因此,我需要将新密码与旧密码(保存在数据库中)进行比较,但我没有明文而是一个哈希值。
现在,当我使用相同的盐对新密码进行哈希,并将其与旧密码(已哈希)进行比较时,我无法确定新密码和旧密码是否相似。
我只是想知道公司如何做到这一点,当它们不将密码保存为明文在数据库中时?
在谷歌上我没找到什么有用的信息。如果有人有任何建议,或者链接到更详细讨论此问题的文章,我将不胜感激。

3
仅通过哈希值无法测试相似度,只能测试相等性。 - Mark Baker
1
如果可能的话,哈希将变得无用。 - user557846
1
从来没有见过哪个网站会检查密码是否是“相似”,只有检查密码是否完全相等。如果它们确实检查密码是否“相似”,那么它们很可能以明文形式存储密码(这种情况比人们想象的要常见得多)。 - Jite
这就是为令我感到困惑的原因,他们说这两个密码太相似。因为“test”和“testt”在哈希后可能被认为是完全不同的,而“test”和“$7of2ljf”在哈希后可能是相似的。 - isuckatcoding
1
@Jite - 不一定以明文形式存储,但在银行业可能会使用加密而不是哈希。 - Mark Baker
显示剩余5条评论
3个回答

11

如果存储的密码是散列(而不是加密),则一种测试相似性的方法是生成许多可能的新密码排列,将这些排列哈希,然后查看这些哈希值是否与存储的哈希值相对应。

生成排列的规则将与禁止的相似性规则相同。

NEW

password1

新的

password2

排列组合

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

4
你需要生成所有可能导致新密码与旧密码太相似而无效的排列组合,然后对这些排列组合进行哈希处理,以查看其中是否有任何一个与旧哈希匹配。本质上,这是基于规则的试错过程,以查看是否可以从新密码生成旧密码。对于任何哈希函数(假设使用相同的盐和哈希迭代次数),你始终会得到相同的哈希输出。否则,你无法将哈希用于身份验证。 - Eric J.
1
如果对于相同的输入哈希值都不同,那么如何用于比较密码呢?是的,输出结果为 :) - eis
1
@AndrewBrown:对于同一用户,您必须使用相同的盐,否则系统将永远无法知道用户输入的密码是否正确。如果用户输入的密码总是散列为与存储在数据库中的内容不同的内容,则用户将永远无法进入系统。 - Eric J.
5
请考虑删除您上面的所有评论。它们中没有一个正确的,会让未来的读者误认为这种方法是错误的。这是正确的答案。 - Marcus Adams
1
@AndrewBrown - 此外,新的password_verify()函数还有一个故意设置的速度限制器,以防止使用快速处理器和GPU运行数百万次尝试的暴力攻击。 - Mark Baker
显示剩余7条评论

1
在生成新密码时,人们通常会创建一个随机字符串作为密码,并将其发送给用户(通过电子邮件、短信或其他方式),然后对该字符串进行哈希处理,并将哈希密码保存在数据库中。
不需要恢复旧密码。像md5()这样的哈希方法是无法解密或还原的,这就是为什么我们使用它们来避免被黑客解密的原因。

也许我应该换一家银行。他们要求我每半年左右更改一次密码,但如果我的新密码与旧密码太相似,他们会发现。 - isuckatcoding
在数据库中存储加密密码是一个非常糟糕的想法。只需询问任何一家曾经遭受过加密密码和加密密钥被盗的知名网站即可明白这一点。 - Eric J.
“像md5()这样的哈希方法无法被解密或还原”,而且您坚持使用md5(这是追溯到1996年的东西),还是我理解有误? - Funk Forty Niner
1
"md5" 绝对可以被破解。事实上,我的 nVidia 显卡是一台 128 核心处理器的 md5 破解机器 http://3.14.by/en/md5 (请注意,2009 年硬件在单个图形卡上暴力破解了每秒 3.5 亿个潜在密码。严重的黑客通过僵尸网络控制数千台计算机,可以通过暴力破解来破解所有 md5)。 - Eric J.
1
在计算机速度/年龄方面,7分钟就相当于... 150亿人类年!@EricJ. 这是非常多的计算。 - Funk Forty Niner
显示剩余5条评论

1

在对两个几乎相同的字符串进行哈希后(假设只有一位不同),它们的哈希值将完全不同...而且可能会出现两个完全不同的字符串具有类似的哈希值。

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

此外,您不应该恢复旧密码。政策是当用户忘记旧密码时,应始终创建新密码。如果您允许他们恢复/猜测密码,则也会帮助攻击者破解用户密码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接