默认情况下,Windows使用微软所称的NThash (有时称为NTLM散列)来散列所有密码,这只是密码的utf-16 LE(小endian)表示的MD4。
从技术上讲,MD4是一个单向散列,所以不可能从其中检索密码。然而,它的使用方式非常薄弱,因此在实践中通常有可能逆转哈希。
- 彩虹表:密码在散列前不加盐,所以给定的密码在任何系统上都会产生相同的NThash。这意味着它们可以在巨型查找表中预先计算(按散列摘要排序以启用二进制搜索),称为“彩虹表”。网络上有很多彩虹表,如果你有很多时间消磨时间的话,你也可以自己制作。彩虹表永远无法存储所有可能的哈希值-- MD4摘要有128位长,这意味着2^128个可能值,这远远超出了目前存在或可能存在的所有数据存储的容量--但它们肯定可以存储数十亿个可能的密码,这使得所有密码(除了最长/最模糊的密码)在实践中都可以破解。
- 哈希强制程序:像MD4这样的哈希算法被设计成能够快速运行,特别是MD4已经有近30年的历史了,所以你可以用相同的钱获得数万倍的计算能力。这意味着可以非常快地计算散列,特别是如果您有一个处理器,它能够并行地对多个数据(候选密码)执行相同的指令(MD4的步骤),并将结果收集到一个有组织的输出中。这(单指令-多数据或SIMD操作)被证明是GPU的工作方式.一个单一的高端GPU每秒可以计算数十亿个散列,并且有一些程序可以运行,这些程序将使用您的GPU试图强行强制密码散列。即使没有彩虹表,如果你有一个好的显卡,你也可以很快地强制大多数密码。
还可以使用两种非默认方式配置Windows,这将使此任务更加容易:
- 遗留的"LM“或"LANMAN”/“LANMAN”散列算法使MD4看起来更加现代和安全。LM散列只能用于长度可达14个字符的密码,而且仅因为实际操作是对7个字符块的对执行的,并且结果是串联的。它还只支持一组有限的输入字符(特别是在哈希前它大写了密码)。因此,您可以强制每个LM哈希的每一半和非常快;您的典型CPU可以暴力-强制任何LM哈希在一分钟之内。默认情况下,所有最新版本的Windows都禁用LM散列(如果您使用至少15个字符长的密码,即使在XP等旧版本中也不会使用),所以您很难在Win10上找到它们,但我认为仍然有可能启用它们。
- Windows支持在可逆加密(而不是散列)下存储密码的能力。这允许任何管理员用户检索任何用户的密码,因为很明显,MSFT的一些客户非常想要这种能力。这是一个糟糕的想法,永远不应该启用,因为除了让管理员查看用户密码之外,它还允许任何能够访问硬盘并知道如何检索机器密钥的人,加密的密码也可以查看用户密码(而且有这样的工具)。任何给定的Windows机器上的密码都不太可能以这种方式存储,但是如果它们是这样的话,那么如果您对系统具有管理员级访问权限或物理访问其系统卷,那么实际上可以直接检索它们。
编辑:正如HackneyB在评论中指出的那样,微软不能错过在过时密码哈希的基础上添加一些无用的混淆信息的机会,因此他们将其封装成多层无效加密(因为密钥要么存储在纯文本中,要么可以从纯文本值派生,所以哪种密码或使用多少层并不重要)。但是,除去混淆,唯一真正的防止逆转密码的密码保护是单轮未加盐的MD4哈希。