9

我已经看到了一些关于此的帖子,但我还没有看到明确的答案。因此,我想我会尝试在新的背景下(国防部)重申这个问题。

根据 DISA 的“应用程序安全和开发 STIG,V3R2 ”,第3.1.24.2 节密码复杂性和维护,DoD 企业软件对密码有相当严格的指导:

  • 密码长度必须至少为 15 个字符。

  • 密码必须包含大写字母、小写字母、数字和特殊字符的组合。

  • 更改密码后,用户不得使用姓名、电话号码、帐户名称或字典单词等个人信息。

  • 密码必须在 60 天后过期。

  • 用户不得重复使用之前的 10 个密码中的任何一个。

  • 确保应用程序能够在更改密码时要求新帐户密码与以前的密码至少相差四个字符。

  • 用户每天更改密码的次数不得超过一次,管理员或特权用户除外。特权用户可能需要重置用户忘记的密码,并且可以每天多次更改密码。

NullUserException 的帖子中所述,为了让开发人员真正能够检查最后 X 数量的密码(并确保新密码与以前的密码不同 [项目符号 6 ]),必须使用可逆密码对密码进行加密方法,而不是散列密码(即使我使用的是 NSA 批准的加密算法,这也更加不安全)。提议的答案似乎很有意义,尽管似乎存在一些差异和争论,如Dan Vinton 的帖子所示。

我想这里真正的问题是,是否有人能够实现所有这些看似常见的密码复杂性约束,而不会真正降低其系统的安全性


编辑:漏洞 APP3320.7(要点 6)指出“确保应用程序有能力在更改密码时要求新帐户密码与以前的密码至少相差四个字符。” 这让我相信我必须运行一个字符串相似度算法,比如 Levenshtein 来检查相似度。我不能在哈希/盐上这样做。如果我在这里错了,请告诉我?

4

3 回答 3

12

所述的字符距离要求仅适用于(一个)前一个密码,而不是前 10 个密码。假设您的密码工具需要输入当前密码和新密码,您只需检查一下即可;无需在那里存储任何东西。(也注意到你提到的帖子的这个答案。)

当然,不匹配前 10 个密码中的任何一个的要求是通过检查旧哈希值来处理的。

于 2013-02-24T10:30:42.487 回答
1

使用可逆方法生成密码派生密钥不是一种安全的做法,您不得这样做。您也不能存储纯文本身份验证信息。由于您将存储密钥(可能还有盐,如果您喜欢这种恋物癖),保留最后 10 个密钥的副本并对照它们检查新提交的密码是微不足道的。

于 2013-02-24T10:02:59.800 回答
-1

要求新密码与之前的 N 个密码相差 M 个字符是很疯狂的,因为这意味着密码历史要么是明文要么是可逆加密的,这两者都不安全。

当存储空间成本过高时,将密码历史限制为“最后 N 次”并因此将密码更改频率限制为“每天一次”是有意义的,但在存储空间非常便宜的今天却毫无意义。一个更合理的策略是“新密码不能与任何已知的旧密码相同”并保持不变。抛弃“最后 N 个”并抛弃“每天最多一次”规则,该规则只是为了防止用户绕过历史记录。

一些密码管理系统支持这种配置(并且已经支持了很多年)。示例:https ://hitachi-id.com/password-manager/features/password-policy-enforcement.html

于 2018-04-26T21:29:31.873 回答