检查密码复杂性:与最近的X密码不同

时间:2011-09-01 03:14:29

标签: security encryption passwords

大多数服务,程序等都有各种密码复杂性检查。在没有深入研究efficacy of such checks的情况下,我想到了一个可能有趣但可能有问题的检查:

“新密码必须是Y个字符与上一个X密码不同。”

这会阻止用户使用Password1!Password2!等密码。但是如果这样做了,就不能对先前使用的密码进行哈希处理 - 它们最好是加密的......对吗?

对于较小的Y和一个相当短的密码,您可能仍然可以存储新密码的所有Y字母变体的哈希和强制执行,但这不可行Y和密码长度增长。

我最初的想法是这样的:因为当您更改密码时,您必须提供原始密码,散列新密码并以加密形式存储旧密码。现在它是可逆的。

因此,假设有效密码始终是哈希值,那么有更好的方法吗?还有这样做增加减少应用程序的安全性吗?

3 个答案:

答案 0 :(得分:2)

我试着把它放在评论中,但我认为这很重要,可以回答。

OP提出的方案必然违反CWE-257。该提议不允许系统管理员(例如)恢复旧密码。

建议使用 new 密码作为所有密码的加密密钥。如果您可以使用客户端而不是服务器上的“新密码验证”,那么使用密码加密任何其他内容都不会安全。

因此“更改密码”小工具将是客户端代码。服务器将发送N个早期密码的加密列表,客户端可以使用用户的当前密码对其进行解密,然后使用用户的新密码重新加密。服务器在任何时候都没有足够的信息来确定任何密码,无论是新密码还是新密码。只有客户端有这些信息,但无论如何都有...不同之处在于,了解当前密码的攻击者也可以学习您的旧密码。因为学习当前的密码已经是一场灾难,所以这并没有让我感到更加糟糕。

是的,这并不能防止员工编写自己的密码更改实用程序以解决密码限制的“攻击”,因为验证不是在服务器端完成的。但在我看来,这绝不违反CWE-257。

这实际上是一个相当聪明的主意。

答案 1 :(得分:1)

您引用的Oracle要求说密码n必须与密码n-1充分不同,而不是密码n必须与所有以前的密码不同。通常要更改密码,您可以让用户输入当前密码作为其中的一部分。因此,您拥有实现该要求所需的一切,并且您无需以可逆的方式存储密码(加密,强制执行等)。

据我所知,这并没有直接解决最初提出的要求(与最后的X密码不同),但我的感觉是这是一个虚假的要求。您的要求需要可逆密码(机制无关紧要),大多数专家都会认为这是不正确的。我相信你只是误解了Oracle的要求,如果这确实是推动这个问题的原因。

修改

好的,我只想到一种方法来实现你所要求的,没有可逆密码。我仍然认为你错误地解释了Oracle的要求,我实际上并不会做我自己要描述的事情,但它会满足要求而不需要可逆密码。

  1. 选择一个不允许出现在真实密码中的保留字符。为了便于讨论,假设它是反斜杠。
  2. 列举所有可能的方法,将最多Y个反斜杠替换为密码,每次都对结果进行哈希处理。
  3. 仅保留最近生成的X组哈希值。
  4. 当用户选择新密码时,请对提交的密码重复此过程,并将其各个哈希值与最近的单个哈希值进行比较。
  5. 高飞,但那应该符合要求。

答案 2 :(得分:0)

加密密码明显违反了CWE-257,并且应该永远不会。但是,如果密码过期,用户刚刚登录,则保留此密码的纯文本。然后强制用户更改密码并计算两者之间的hamming distance。一旦用户提供了足够不同的密码,请散列此新密码并丢弃纯文本。

编辑: 您可以保留所有旧密码的salt + hash,以确保用户不会选择过去的密码。但强制要求密码为N个字母,与所有密码不同会削弱整个系统,并且价格昂贵,因为它需要进行o(n)比较。