如果我不能选择与以前相同或相似的密码,它是否以明文形式存储在某处?

If I can't choose same or similar password as previously, is it stored in plaintext somewhere?

标题其实已经说明了一切,但我会把我的想法写在这里作为一个上下文。

据我所知,在撰写本文时存储密码的实际方法是通过加盐和散列(如果我错了请纠正我),关键是密码不存储在任何地方都是明文,盐可以防止 rainbow-table 攻击等。我不是很精通这个,但是我从网上收集的这些信息。

好的,又到了修改密码的时候了。如果我选择相同的密码,加盐哈希将匹配,我会收到提示,提示密码与之前相同。现在有些系统还阻止您将密码设置为例如50% 或 70% 与您之前的密码或您之前的密码之一相似。

我认为这没问题 security-wise,但是如果密码没有以明文形式存储在任何地方,这怎么办?或者他们是?

答案可能比你想象的要简单,很多时候你需要同时输入旧密码和新密码才能更改,所以应用程序会从用户那里得到旧密码。这在安全方面实际上是一件好事,因为只有知道旧密码的用户才能将其更改为另一个密码。

正如@martinstoeckli 所说,最简单的答案是,您通常在更改密码时必须输入以前的密码 - 因此它可以在内存中比较两者。

但是,即使旧密码是散列存储的,也可以检查相似密码,方法是采用新密码,对其应用各种转换(更改单个字符,将末尾的数字减一,删除最后一个字符等),散列这些排列,然后将它们与先前存储的密码进行比较。如果您使用的是良好的密码哈希算法 (bcrypt/scrypt/Argon2id/PBKDF2),那么这会相当慢,但是使用更快的算法则不会有明显的延迟。

值得注意的是,如果攻击者可以访问以前的密码,这些类型的转换通常被攻击者使用,并且还与词表一起使用以尝试猜测常用词的变体。