Active Directory 如何在设置新密码时比较用户以前的密码?

Posted

技术标签:

【中文标题】Active Directory 如何在设置新密码时比较用户以前的密码?【英文标题】:How can Active Directory compare a users previous passwords when setting a new one? 【发布时间】:2012-05-21 19:38:39 【问题描述】:

这是大学作业。在我们学院,他们使用 Microsoft 的 Active Directory 来运行他们的网络。

每个月我们都会被要求更改密码,当我们这样做时,它不会接受我们之前使用过的五个密码或类似密码中的任何一个。例如,如果我的密码是“secretpassword1”,下个月我就不能使用“secretpassword2”了。

但是,我可以看到这样做的唯一方法是用于存储密码的散列算法是否存在缺陷;密码不是散列而是加密的;或更糟糕的是,它们以明文形式存储。

在快速的 Google-Fu 会话之后,Active Directory 似乎会将密码存储在常规 Windows 哈希中。那么有人能解释一下吗?

干杯

附:这可能是我们的想象;也许您可以重复使用稍微不同的密码?

【问题讨论】:

【参考方案1】:

如果您从新密码而不是旧密码生成变体,这很容易做到。

想象一个算法,它接受一个密码,并生成数百个简单的变体。因此,对于像 password1 这样的输入,它会生成以下变体:

PASSWORD1
PasSSword1
password2
password
P@aaW0RD2
....

还有数百人。 (请注意,其中一种变体是"password"。)

密码破解者拥有类似的算法,并使用它们对单词字典进行猜测。

使用这个算法,我们可以执行以下步骤:

    用户将他们的第一个密码设置为"password"。 系统存储hash("password"),并在用户登录时使用此哈希进行比较。

    几周后,用户将密码更改为"hunter2"。当前密码哈希更改为hash("hunter2")hash("password") 存储在 N 个历史密码哈希列表中。

    此后数周,用户尝试将其密码更改为"password1"。在此更改尝试期间,将执行以下步骤。

3a) 新密码是明文可用的,因为用户刚刚输入了它。 "password1" 用作上述变体生成算法的输入。生成了数百个不同的密码(明文)。

3b) 对于每个变体密码,使用每个旧密码的盐值计算该密码hash(variant) 的哈希值。如上所述,"password1" 的变体之一是"password",因此在我们的变体哈希列表中,我们将拥有hash("password")。我们最终使用 V 个变体哈希来测试每个旧密码,总共有 V*N 个哈希。

3c) 针对当前散列和之前的散列测试每个变体散列的正确加盐版本,进行总共 V * N 二进制数组比较。

3d) 变体哈希之一是hash("password"),存储的 N 个历史哈希之一也是 hash("password")。这些哈希完全匹配,因此密码被拒绝。

此技术需要生成 V*N 哈希,其中 V 约为 500,N 约为 10。这只需几秒钟(即使使用 PBKDF2、bcrypt 或 scrypt),并且无需访问磁盘即可轻松执行。

关于 salt 的注意事项:每当您更改用户密码时更改 salt(您绝对应该这样做)确实会使事情变得更加困难,但您仍然只需要生成线性数量的哈希,无论您的 salt 有多大是。

【讨论】:

【参考方案2】:

旧密码(以散列格式)存储在 AD 数据库中。作为密码更改过程的一部分,这将被检查和/或更新。

【讨论】:

这只是解释了为什么您不能重复使用完全相同的密码。这无法解释几乎相同的密码场景,因为哈希旨在创建非常不同的哈希,即使输入仅变化一位。 您的大学也可能部署了自定义密码过滤器。您的示例应该可以正常工作。

以上是关于Active Directory 如何在设置新密码时比较用户以前的密码?的主要内容,如果未能解决你的问题,请参考以下文章

来宾用户如何在 Azure Active Directory 中重置其 MS Authenticator MFA 设置?

如何使用 Azure Active Directory 设置 Ocelot Api 网关

win7 中 active directory在哪里可以找到?

如何以管理方式为忘记密码的 ASP.net 身份用户设置新密码?

无法使用 django-graphql-auth 设置新密码

将Samba设置为Active Directory域控制器