NTLM 用户身份验证

本文提供有关 NTLM 用户身份验证的一些信息。

原始 KB 数: 102716

总结

本文讨论 Windows 中 NTLM 用户身份验证的以下方面:

  • 帐户数据库中的密码存储
  • 使用 MSV1_0 身份验证包进行用户身份验证
  • 直通身份验证

详细信息

帐户数据库中的密码存储

用户记录存储在安全帐户管理器(SAM)数据库或 Active Directory 数据库中。 每个用户帐户都与两个密码相关联:LAN 管理器兼容的密码和 Windows 密码。 每个密码都加密并存储在 SAM 数据库或 Active Directory 数据库中。

与 LAN 管理器兼容的密码与 LAN 管理器使用的密码兼容。 此密码基于原始设备制造商(OEM)字符集。 此密码不区分大小写,长度可达 14 个字符。 此密码的 OWF 版本也称为 LAN 管理器 OWF 或 ESTD 版本。 此密码是使用 DES 加密通过明文密码加密常量计算的。 LAN 管理器 OWF 密码长度为 16 字节。 明文密码的前 7 个字节用于计算 LAN 管理器 OWF 密码的前 8 个字节。 明文密码的第二个 7 个字节用于计算机 LAN 管理器 OWF 密码的第二个 8 个字节。

Windows 密码基于 Unicode 字符集。 此密码区分大小写,长度可达 128 个字符。 此密码的 OWF 版本也称为 Windows OWF 密码。 此密码是使用 RSA MD4 哈希函数计算的。 此函数计算明文密码字节的可变长度字符串的 16 字节摘要。

任何用户帐户都可能缺少 LAN 管理器密码或 Windows 密码。 但是,每次尝试都维护这两个版本的密码。

例如,如果使用 PortUas 从 LAN Manager UAS 数据库移植了用户帐户,或者从 LAN Manager 客户端或 Windows for Workgroups 客户端更改密码,则只有 LAN Manager 版本的密码存在。 如果在 Windows 客户端上设置或更改密码,并且密码没有 LAN 管理器表示形式,则只有 Windows 版本的密码将存在。 (密码可能没有 LAN 管理器表示形式,因为密码长度超过 14 个字符,或者因为不能在 OEM 字符集中表示字符。

Windows 中的用户界面限制不允许 Windows 密码超过 14 个字符。 本文稍后将讨论此限制的含义。

在 Windows 2000 Service Pack 2 和更高版本的 Windows 中,有一个设置可用于阻止 Windows 存储密码的 LAN 管理器哈希。 有关详细信息,请查看以下文章编号以查看Microsoft知识库中的文章:

299656 如何防止 Windows 在 Active Directory 和本地 SAM 数据库中存储密码的 LAN 管理器哈希

注意

Microsoft不支持手动或以编程方式更改 SAM 数据库。

使用 MSV1_0 身份验证包进行用户身份验证

Windows 将 LsaLogonUser API 用于所有类型的用户身份验证。 LsaLogonUser API 通过调用身份验证包对用户进行身份验证。 默认情况下,LsaLogonUser 调用 MSV1_0 (MSV) 身份验证包。 此包包含在 Windows NT 中。 MSV 身份验证包将用户记录存储在 SAM 数据库中。 此包支持使用 Netlogon 服务对其他域中的用户进行直通身份验证。

在内部,MSV 身份验证包分为两个部分。 MSV 身份验证包的第一部分在连接到的计算机上运行。 第二部分在包含用户帐户的计算机上运行。 当这两个部分在同一台计算机上运行时,MSV 身份验证包的第一部分会调用第二部分,而不涉及 Netlogon 服务。 MSV 身份验证包的第一部分可识别传递身份验证是必需的,因为传递的域名不是其自己的域名。 需要直通身份验证时,MSV 会将请求传递给 Netlogon 服务。 然后,Netlogon 服务将请求路由到目标计算机上的 Netlogon 服务。 反过来,Netlogon 服务会将请求传递给该计算机上的 MSV 身份验证包的另一部分。

LsaLogonUser 支持交互式登录、服务登录和网络登录。 在 MSV 身份验证包中,所有登录形式都传递用户帐户的名称、包含用户帐户的域的名称以及用户密码的某些功能。 将密码传递给 LsaLogonUser 时,不同类型的登录表示不同的密码。

对于交互式登录、批量登录和服务登录,登录客户端位于运行 MSV 身份验证包第一部分的计算机上。 在这种情况下,明文密码将传递给 LsaLogonUser 和 MSV 身份验证包的第一部分。 对于服务登录和批处理登录,服务控制管理器和任务计划程序提供了一种更安全的方式来存储帐户的凭据。

MSV 身份验证包的第一部分将明文密码转换为 LAN Manager OWF 密码和 Windows NT OWF 密码。 然后,包的第一部分会将明文密码传递给 NetLogon 服务或包的第二部分。 第二部分随后查询 SAM 数据库以获取 OWF 密码,并确保它们相同。

对于网络登录,连接到计算机的客户端以前具有 16 字节质询或“nonce”。如果客户端是 LAN 管理器客户端,则客户端通过使用 16 字节 LAN 管理器 OWF 密码加密 16 字节质询来计算 24 字节质询响应。 然后,LAN Manager 客户端将此“LAN 管理器质询响应”传递给服务器。 如果客户端是 Windows 客户端,则使用相同的算法计算“Windows NT 质询响应”。 但是,Windows 客户端使用 16 字节的 Windows OWF 数据,而不是 LAN 管理器 OWF 数据。 然后,Windows 客户端会将 LAN 管理器质询响应和 Windows NT 质询响应传递给服务器。 无论哪种情况,服务器都会将以下所有内容传递给 LsaLogonUser API 来对用户进行身份验证:

  • 域名
  • 用户名
  • 原始挑战
  • LAN 管理器质询响应
  • 可选的 Windows NT 质询响应

MSV 身份验证包的第一部分会将此信息传递给第二部分。 首先,第二部分从 SAM 数据库或 Active Directory 数据库查询 OWF 密码。 然后,第二部分通过使用数据库中的 OWF 密码和传入的质询来计算质询响应。 然后,第二部分将计算质询响应与传入质询响应进行比较。

注意

NTLMv2 还允许客户端使用会话密钥来发送质询,以帮助降低常见攻击的风险。

如前所述,SAM 数据库或 Active Directory 数据库中可能缺少密码版本。 此外,调用 LsaLogonUser 时可能缺少密码的任一版本。 如果 SAM 数据库中的密码版本和 LsaLogonUser 中的密码的 Windows 版本都可用,则使用它们。 否则,使用 LAN 管理器版本的密码进行比较。 当从 Windows 到 Windows 进行网络登录时,此规则有助于强制实施区分大小写。 此规则还允许向后兼容。

直通身份验证

NetLogon 服务实现直通身份验证。 它执行以下功能:

  • 选择要向其传递身份验证请求的域。
  • 选择域中的服务器。
  • 将身份验证请求传递到所选服务器。

选择域非常简单。 域名将传递给 LsaLogonUser。 域名的处理方式如下:

  • 如果域名与 SAM 数据库的名称匹配,则会在该计算机上处理身份验证。 在属于域成员的 Windows 工作站上,SAM 数据库的名称被视为计算机的名称。 在 Active Directory 域控制器上,帐户数据库的名称是域的名称。 在不是域成员的计算机上,所有登录都在本地处理请求。
  • 如果此域信任指定的域名,身份验证请求将传递到受信任的域。 在 Active Directory 域控制器上,可以轻松获取受信任的域列表。 在 Windows 域的成员上,请求始终传递到工作站的主域,让主域确定指定的域是否受信任。
  • 如果域不信任指定的域名,则会在连接到的计算机上处理身份验证请求,就好像指定的域名是该域名一样。 NetLogon 不区分不存在的域、不受信任的域和错误键入的域名。

NetLogon 通过名为“发现”的进程选择域中的服务器。 Windows 工作站在其主域中发现其中一个 Windows Active Directory 域控制器的名称。 Active Directory 域控制器发现每个受信任域中 Active Directory 域控制器的名称。 执行发现的组件是在 Netlogon 服务中运行的 DC 定位符。 DC 定位符使用 NETBIOS 或 DNS 名称解析来查找所需的服务器,具体取决于配置的域和信任类型。