Windows 在设置新密码时,Active Directory如何比较用户以前的密码?
这是大学作业。在我们学院,他们使用微软的Active Directory来运行他们的网络 每个月我们都会被要求更改密码,当我们这样做时,它不会接受我们之前使用的五个密码中的任何一个,或者类似的密码。例如,如果我的密码是“secretpassword1”,下个月我就不能使用“secretpassword2” 然而,我能看到的唯一方法是,如果用于存储密码的哈希算法中存在缺陷;密码不是散列而是加密的;更糟糕的是,它们以明文形式存储 在快速的GoogleFu会话之后,Active Directory似乎将在常规Windows哈希中存储密码。有人能解释一下吗 干杯Windows 在设置新密码时,Active Directory如何比较用户以前的密码?,windows,security,active-directory,passwords,password-protection,Windows,Security,Active Directory,Passwords,Password Protection,这是大学作业。在我们学院,他们使用微软的Active Directory来运行他们的网络 每个月我们都会被要求更改密码,当我们这样做时,它不会接受我们之前使用的五个密码中的任何一个,或者类似的密码。例如,如果我的密码是“secretpassword1”,下个月我就不能使用“secretpassword2” 然而,我能看到的唯一方法是,如果用于存储密码的哈希算法中存在缺陷;密码不是散列而是加密的;更糟糕的是,它们以明文形式存储 在快速的GoogleFu会话之后,Active Directory似乎
另外,这可能是我们的想象;也许您可以重新使用略有不同的密码?旧密码(以哈希格式)存储在AD数据库中。作为密码更改过程的一部分,将对此进行检查和/或更新 如果您根据新密码而不是旧密码生成变体,那么很容易做到这一点 想象一下,一个算法接受密码,并生成几百个简单的密码变体。因此,对于像
password1
这样的输入,它将生成以下变量:
PASSWORD1
PasSSword1
password2
password
P@aaW0RD2
....
还有几百个。(请注意,其中一个变体是“password”
)
密码破解者有这样的算法,并使用它们对单词词典进行猜测
使用此算法,我们可以执行以下步骤:
“password”
。
系统存储散列(“密码”)
,并在用户登录时使用此散列进行比较“hunter2”
。当前密码哈希更改为哈希(“hunter2”)
<代码>哈希(“密码”)存储在N个历史密码哈希列表中“password1”
。在此更改尝试期间,将执行以下步骤hash(variant)
。如上所述,“password1”
的变体之一是“password”
,因此在我们的变体哈希列表中,我们将有哈希(“password”)
。我们最后使用V variant散列来测试每个旧密码,V*N散列总数
3c)针对当前散列和之前的散列,对每个变量散列的正确盐析版本进行测试,以进行总V*N二进制数组比较
3d)其中一个变量散列是散列(“密码”)
,存储的N个历史散列中的一个也是散列(“密码”)
。这些哈希值完全匹配,因此密码被拒绝
这种技术需要生成V*N散列,其中V为~500,N为~10。这只需要几秒钟(即使使用PBKDF2、bcrypt或scrypt),而且无需磁盘访问即可轻松执行
关于salt的注意事项:每当您更改用户密码时(您肯定应该这样做),更改salt确实会让事情变得更加困难,但无论salt有多大,您仍然只需要生成线性数的散列。这只是解释了为什么不能重复使用完全相同的密码。几乎相同的密码场景不能用这一点来解释,因为散列被设计为创建非常不同的散列,即使输入仅变化一位。您的大学也可能部署了自定义密码过滤器。你的例子应该很好用。