NTLM 用户身份验证

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

适用于: Windows Server 2012 R2
原始 KB 编号: 102716

摘要

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

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

更多信息

帐户数据库中的密码存储

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

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

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

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

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

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

在 Windows 2000 Service Pack 2 和更高版本的 Windows 中,有一个设置可用于阻止 Windows 存储密码的 LAN Manager 哈希。 有关详细信息,检查下面的文章编号以查看 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 管理器 OWF 密码和Windows NT OWF 密码。 然后,包的第一部分将明文密码传递给 NetLogon 服务或包的第二部分。 然后,第二部分在 SAM 数据库中查询 OWF 密码,并确保它们相同。

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

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

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

注意

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

如前所述,SAM 数据库或 Active Directory 数据库中可能缺少任一版本的密码。 此外,调用 LsaLogonUser 时可能缺少密码的任一版本。 如果来自 SAM 数据库的密码的 Windows 版本和来自 LsaLogonUser 的密码的 Windows 版本都可用,则同时使用它们。 否则,将使用 LAN Manager 版本的密码进行比较。 此规则有助于在从 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 名称解析来查找所需的服务器,具体取决于配置的域类型和信任。