标题实际上已经说明了一切,但我将把我的想法作为上下文写在这里。
据我所知,在编写时存储密码的事实上的方法是通过盐和哈希(如果我错了请纠正我),这样做的要点是密码不会以明文形式存储在任何地方,盐可以防止彩虹表攻击等。这方面我不是很精通,但这是我从网上搜集的信息。
好了,又到了修改密码的时候了。如果选择相同的密码,则盐渍散列将匹配,并且我将得到一个提示,表示密码与之前相同。现在有些系统还会阻止您将密码设置为与以前的密码相似的50%或70%,或者您以前的密码之一。
我相信这是很好的安全明智的,但是如果密码不以明文形式存储在任何地方,如何做到这一点?真的是吗?
答案可能比您想象的要简单,通常您必须输入旧密码和新密码才能更改它,因此应用程序从用户那里获得旧密码。这实际上是一件安全方面的好事,因为只有知道旧密码的用户才能将其更改为另一个密码。
正如@martinstoeckli所说,最简单的答案是,当您更改密码时,通常必须输入您以前的密码-因此它可以在内存中比较两者。
然而,即使旧密码被散列存储,也可以检查相似的密码,方法是获取新密码,对其应用各种转换(更改单个字符,将末尾的数字减少1,删除最后一个字符等),对这些排列进行散列,然后将其与先前存储的密码进行比较。如果你使用一个好的密码哈希算法(bcrypt/scrypt/Argon2id/PBKDF2),那么这将是相当慢的,但与更快的算法,那么它不会是一个明显的延迟。
值得注意的是,如果攻击者可以访问以前的密码,则这些类型的转换通常被攻击者使用,并且还与单词列表一起使用,以尝试和猜测常见单词的变体。