关于windows密码加密算法的说明

本文深入探讨了Windows系统中密码哈希的创建和存储,尤其是LANManager(LM)和NTLANManager第二版(NTLMv2)。LM哈希由于使用DES加密和有限的字符长度,存在明显的安全性问题,容易遭受暴力破解。相比之下,NTLMv2使用MD4算法,更为安全,但缺乏Salting技术。文章还提到了Windows从WindowsServer2003SP1开始的NTLM密码策略变化,允许旧密码在一定时间内有效,但可通过注册表设置调整这一行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

本文的主要介绍Windows创建和存储密码哈希(Hash)的方式,以及这些哈希的破解方式。

我们使用的Windows的计算机使用两种方法对用户密码创建哈希,这两种方法在本质上有着不同的安全意义。这两种方法分别是LAN Manager (LM)以及NT LAN Manager第二版(NTLMv2)。哈希是一种加密算法,通过对加密对象字符串计算得出一个字符串,这种加密需要获取任意大小的字符串数据,并用算法对其进行加密,然后返回一个固定大小的字符串。

其中,早期的LAN Manager哈希是Windows操作系统最早使用的密码哈希算法之一,并且在Windows 2000、XP、Vista和7中使用了更先进的NTLMv2之前,这也是唯一可用的版本。这些新的操作系统虽然可以支持使用LM哈希,但主要是为了提供向后兼容性,不过在Windows Vista和Windows 7中,该算法默认是被禁用的。

LAN Manager哈希需要使用下列六个步骤计算获得:

●将用户的密码全部转换为大写字母

●给密码添加空(null)字符,直到密码长度等于14个字符

●将新获得的密码拆分为两组7位的字符值组

●使用这些值创建两个DES加密密钥,并为每一组添加一个奇偶校验位,这样即可创建出64位的密钥

●使用每个DES密钥加密一个预定义的ASCII字符(KGS!@#$%),这样即可获得两个8字节Ciphertext值

●这两个8字节的Ciphertext值结合组成一个16字节的值,也就是最终获得的LM哈希。

但是LM存储的密码有一些明显的不足。

首先,加密工作是基于数据加密标准(DES)的,DES最初来源于IBM在二十世纪七十年代的一个项目,该项目最终被NIST进行了改进,并获得了NSA的支持,于1981年作为一项ANSI标准发布。多年以来,DES都被认为是足够安全的,但由于这种小型密钥只有56位,因此从九十年代开始,已经变得不那么安全。到了1998年,Electronic Frontier Foundation只需要大概23小时即可破解DES。因此,DES开始变得不够安全,并逐渐被三重DES(Triple-DES)以及AES所取代。简单来说,这些都属于其他加密标准,但由于现代计算机的强大性能,很快也被破解。

LM哈希最大的弱点可能就是DES密钥的创建过程。在这个过程中,用户提供的密码会被自动转换为全部大写,并通过补充变为14个字符(这也是LM哈希密码的最大长度),随后会被分为两组7位字符的值。对于由14个可印刷的ASCII字符组成的密码,有95的14次方种可能性,而一旦将其腰斩为两组7位的字符,可能性就降低为95的7次方种,而如果您只允许使用大写的ASCII字符,可能性将进一步降低为69的7次方种。因此从本质上将,就算您使用不同的大小写字符,并使用长密码,一旦密码被保存成LM哈希,所有的努力都将付诸东流,在暴力破解面前,LM哈希将不堪一击。

基于这种风险,微软推出NT LAN Manager (NTLM)哈希,用于取代LM的身份验证协议。最终通过改进,从Windows NT 4开始,NTLMv2被用作全新的身份验证方法。

更多参见官方文档

二、NTLMv2哈希加密

NTLMv2哈希的创建在操作系统实际参与的工作上更加简单,并需要使用MD4哈希算法,通过一系列数学计算创建哈希。MD4算法需要使用三次,这样才能产生NTLMv2哈希。

MD4通常比DES更加健壮,可以接受更长的密码,可允许同时使用大写和小写的字母,并且并不需要将密码拆分为更小,更易于破解的片段。

对于使用NTLMv2创建的哈希,可能最大的不足在于Windows无法使用一种名为Salting的技术。Salting这种技术可以用于生成随机数,并将该随机数用于计算密码的哈希。这意味着完全相同的密码可能会具有完全不同的哈希值,这才是最理想的情况。

在这种情况下,用户就可以创建所谓的Rainbow Table。Rainbow table并不是指五颜六色的咖啡桌,实际上是一种表格,其中包含了由某一数量的字符所能组成的每一种可能密码的每一个哈希值。通过使用Rainbow table,我们就可以从目标计算机提取密码的哈希值,并在表中进行检索。一旦在表中找到相同的内容,就等于知道了密码。正如您所想的,就算由很少字符组成的Rainbow table,整个表也会非常庞大。这意味着此类表的创建、存储,以及检索都是很麻烦的工作。

三、NTLM密码策略及风险

在此介绍了影响 NTLM 密码更改的新行为以及如何使用注册表来更改此行为。

自Microsoft Windows Server 2003 SP1开始及之后的版本中,NTLM 网络身份验证行为发生了变化。域用户在修改密码后一小时内仍可以使用旧密码访问网络。这是因为基于使用 Kerberos 进行身份验证的现有组件不受此更改的影响。

此更改的目标是允许后台进程(例如服务)继续运行一段时间,直到管理员有机会/时间更新新密码的凭据。

为了在分布式环境中可靠地支持 NTLM 网络身份验证的网络访问,NTLM 网络身份验证设计有如下行为:

1)域用户使用 NTLM 成功更改密码后,旧密码仍可在用户可定义的时间段内用于网络访问。此行为允许在密码更改传导生效这段时间内,某些账户(例如服务帐户)可登录到多台计算机访问网络。

2)密码生存期的延长仅适用于使用 NTLM 的网络访问交互式登录行为不受影响。也不适用于托管在独立服务器或成员服务器上的帐户。只有域用户受此行为影响。

3)可以通过编辑域控制器上的注册表来配置旧密码的生命周期。此注册表更改无需重新启动即可生效。

注:仅当域控制器上的有效密码策略将“强制密码历史记录”设置为指定将记住两个或更多密码的值时,才会出现上文中描述的行为。密码策略应在域级别设置。可以使用 Secpol.msc 管理单元来确定该策略是否已在域控制器上生效。
在这里插入图片描述

【更改域用户旧密码的生命周期】:

要更改旧密码的生命周期,请将名为 OldPasswordAllowedPeriod 的 DWORD 条目添加到域控制器上的以下注册表子项:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

在其下,新建:DWORD值:OldPasswordAllowedPeriod ,创建完成后,将项值的值配置为要过期的时间,0为立即生效。

生命周期以分钟为单位设置。如果未设置此注册表值,则旧密码的默认生命周期为 60 分钟。

在这里插入图片描述
注:此注册表设置不需要重新启动即可生效。且此行为不会导致安全漏洞。只要只有一个用户知道新旧两个密码,用户仍然可以使用任一密码安全地进行身份验证。如果已知用户的密码被泄露,管理员应为该用户及时重置密码并配置为“用户必须在下次登录时更改密码”。管理员应要求用户在下次登录时更改密码,以尽快使旧密码失效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羌俊恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值