Windows 中的 NTLM 用户身份验证


摘要


本文介绍 Windows 中 NTLM 用户身份验证的以下方面:
  • 帐户数据库中的密码存储
  • 使用 MSV1_0 身份验证包进行用户身份验证
  • 传递身份验证

更多信息


帐户数据库中的密码存储

用户记录存储在安全帐户管理器(SAM)数据库或 Active Directory 数据库中。 每个用户帐户都与两个密码相关联: LAN 管理器兼容的密码和 Windows 密码。 每个密码均加密并存储在 SAM 数据库或 Active Directory 数据库中。LAN 管理器兼容的密码与 LAN Manager 使用的密码兼容。 此密码基于原始设备制造商(OEM)字符集。 此密码不区分大小写,最长可达14个字符。 此密码的 OWF 版本也称为 LAN 管理器 OWF 或 ESTD 版本。 此密码通过使用 DES 加密使用明文密码加密常量进行计算。 LAN 管理器 OWF 密码的长度为16个字节。 清除文本密码的前7个字节用于计算 LAN Manager OWF 密码的前8个字节。 明文密码的第二个7字节用于计算机 LAN Manager OWF 密码的第二个字节。Windows 密码基于 Unicode 字符集。 此密码区分大小写,最长可达128个字符。 此密码的 OWF 版本也称为 Windows OWF 密码。 此密码是使用 RSA MD-4 加密算法计算的。 此算法计算纯文本密码字节的可变长度字符串的16字节摘要。任何用户帐户都可能缺少 LAN Manager 密码或 Windows 密码。 但是,每次都将尝试保留密码的两个版本。 例如,如果用户帐户通过使用 PortUas 从 LAN Manager UAS 数据库进行移植,或者从 LAN Manager 客户端或 Windows for 工作组客户端更改了密码,则仅存在该密码的 LAN Manager 版本。 如果在 Windows 客户端上设置或更改密码,并且密码没有 LAN 管理器表示,则仅存在 Windows 版本的密码。 (密码可能没有 LAN 管理器表示形式,因为密码长度超过14个字符,或者因为字符不能在 OEM 字符集中表示。) Windows 中的用户界面限制不允许 Windows 密码超过14个字符。 本文稍后部分将讨论此限制的含义。在 Windows 2000 Service Pack 2 和更高版本的 Windows 中,可以使用设置来阻止 Windows 存储你的密码的 LAN Manager 哈希。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
299656 如何阻止 Windows 在 Active Directory 和本地 SAM 数据库中存储密码的 LAN Manager 哈希  
注意 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 Manager 客户端,则客户端通过使用16字节的 LAN Manager 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 数据库的 Windows 版本的密码和 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 名称解析找到必要的服务器,具体取决于配置的域和信任的类型。