Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 在设置新密码时,Active Directory如何比较用户以前的密码?_Windows_Security_Active Directory_Passwords_Password Protection - Fatal编程技术网

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

Windows 在设置新密码时,Active Directory如何比较用户以前的密码?,windows,security,active-directory,passwords,password-protection,Windows,Security,Active Directory,Passwords,Password Protection,这是大学作业。在我们学院,他们使用微软的Active Directory来运行他们的网络 每个月我们都会被要求更改密码,当我们这样做时,它不会接受我们之前使用的五个密码中的任何一个,或者类似的密码。例如,如果我的密码是“secretpassword1”,下个月我就不能使用“secretpassword2” 然而,我能看到的唯一方法是,如果用于存储密码的哈希算法中存在缺陷;密码不是散列而是加密的;更糟糕的是,它们以明文形式存储 在快速的GoogleFu会话之后,Active Directory似乎

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

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

然而,我能看到的唯一方法是,如果用于存储密码的哈希算法中存在缺陷;密码不是散列而是加密的;更糟糕的是,它们以明文形式存储

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

干杯


另外,这可能是我们的想象;也许您可以重新使用略有不同的密码?

旧密码(以哈希格式)存储在AD数据库中。作为密码更改过程的一部分,将对此进行检查和/或更新

如果您根据新密码而不是旧密码生成变体,那么很容易做到这一点

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

PASSWORD1
PasSSword1
password2
password
P@aaW0RD2
....
还有几百个。(请注意,其中一个变体是
“password”

密码破解者有这样的算法,并使用它们对单词词典进行猜测

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

  • 用户将其第一个密码设置为
    “password”
    。 系统存储
    散列(“密码”)
    ,并在用户登录时使用此散列进行比较

  • 几周后,用户将密码更改为
    “hunter2”
    。当前密码哈希更改为
    哈希(“hunter2”)
    <代码>哈希(“密码”)存储在N个历史密码哈希列表中

  • 几周后,用户尝试将密码更改为
    “password1”
    。在此更改尝试期间,将执行以下步骤

  • 3a)新密码在clear中可用,因为用户刚刚输入<代码>“password1”用作上述变量生成算法的输入。生成了几百个不同的密码(以明文形式)

    3b)对于每个变体密码,使用每个旧密码的salt计算该密码的哈希值
    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有多大,您仍然只需要生成线性数的散列。

    这只是解释了为什么不能重复使用完全相同的密码。几乎相同的密码场景不能用这一点来解释,因为散列被设计为创建非常不同的散列,即使输入仅变化一位。您的大学也可能部署了自定义密码过滤器。你的例子应该很好用。