LM Hash 加密算法过程
LM Hash 的整个加密过程可以分解为以下几个步骤:
- 密码转换:
- 首先,用户的明文密码会被转换为大写字母。这是 LM Hash 最大的安全漏洞之一,因为它会直接忽略密码中所有的大小写信息,大大降低了密码的复杂度。例如,“Password123”和“password123”在经过这一步处理后,都变成了“PASSWORD123”
- 处理后的密码字符串,其长度不能超过 14 个字符。如果密码长度大于 14,则只取前 14 个字符
- 密码填充与拆分:
- 在将密码用于下一步加密之前,需要对它进行填充。如果处理后的密码长度小于 14 个字符,则会在其末尾使用空字符(
\x00
)进行填充,使其总长度达到 14 个字节 - 填充后的 14 字节密码会被拆分为两个7 字节的字符串
- 在将密码用于下一步加密之前,需要对它进行填充。如果处理后的密码长度小于 14 个字符,则会在其末尾使用空字符(
- 密钥生成:
- 接下来,这两个 7 字节的字符串会被分别转换为两个 DES(Data Encryption Standard)密钥
- 转换过程是这样的:每个 7 字节的字符串会被扩展为一个 8 字节的密钥,其中原始 7 个字节的每个字节的低 7 位用于组成密钥的 56 位有效密钥,剩下的 16 位则作为奇偶校验位
- DES 加密:
- 这两个 56 位的 DES 密钥会分别用来加密一个固定的字符串,这个字符串是“KGS!@#$%”。
- DES 算法会以ECB(Electronic Codebook)模式对这个字符串进行加密
- 结果拼接:
- 最后,将两个 DES 加密后得到的 8 字节结果拼接起来,就得到了一个 16 字节(32 个十六进制字符)的 LM Hash
LM Hash 的弱点
通过上述步骤可以看出,LM Hash 的设计存在多个严重的安全缺陷,这也是为什么它早已被淘汰的原因:
- 不区分大小写: 这使得攻击者可以忽略大小写进行暴力破解,显著降低了密码空间的复杂度
- 固定填充和拆分: 无论密码长度如何,最终都是两个 7 字节的字符串。这意味着任何长度小于 8 个字符的密码,其第二个 7 字节的字符串都是相同的(全部由空字符填充)。攻击者只需破解前半部分,就可以得到密码
- 使用弱算法 DES: DES 算法本身已经很脆弱,并且这里的加密是针对一个固定的、公开的字符串“KGS!@#$%”,这为攻击者提供了巨大的便利,因为他们可以预先计算出所有可能的哈希值,然后进行彩虹表攻击(Rainbow Table Attack)