什么是NTLM
=============
Windows Challenge/Response (NTLM) 是用在包括着Windows操作系统的网络中的一种认证(authentication)协议, 也用在stand-alone系统上.
在网络环境中, Microsoft Kerberos 比NTLM添加了更多的安全性. 尽管Microsoft Kerberos 是一个不错的选择, NTLM现在还是被支持的. NTLM必须被使用在stand-alone的系统上, 用来做登录的认证.
NTML的credential是基于在交互登录过程中维护的数据上的, 这里的数据包括域名, 用户名, 还有一个用户密码的单向hash串. NTML使用加密的challenge/response 协议来认证一个用户, 用户的密码不会被在线路上传输. 取明文密码而代之的是, 系统会执行一个计算, 通过这个计算证明他已经访问到了安全的NTLM credentials.
网路上的交互式NTLM认证典型地涉及到两个系统: 一个客户端系统, 在这个系统上, 用户请求认证; 一个域控制器, 其中存放着用户的密码.
非交互式的认证里, 其中一个已经登录了的用户要访问一个资源(比如说服务器应用程序), 这里典型地会涉及到三个系统: 一个客户端, 一个服务器, 和一个域控制器. 域控制器会代替服务器进行authentication的计算.
NTLM的详细过程
==============
下面的步骤展现了一个NTLM非交互式的认证过程. 第一步, 用户提供NTLM credential, 这仅属于非交互式authentication过程的部分.
- (仅非交互式authentication)一个用户访问一个客户端计算机, 提供一个域名, 用户名, 和密码. 客户端计算机会计算出一个加密的密码哈希值, 并丢掉真实的密码.
- 客户端把用户名发送给服务器(使用纯文本发送plaintext)
- 服务器生成一个十六个字节的随机数, 叫做一个challenge 或 nonce. 并把这个challenge发送给客户端.
- 客户端使用用户密码的hash来加密这个challenge, 然后把这个加密后的结果返回给服务器, 这叫做response.
-
服务器发送下面的三项数据给域控制器:
- 用户名
- 发送给客户端的Challenge
- 从客户端收回来的Response
- 域控制器使用用户名来从Security Account Manager 数据库中取得用户密码的hash值. 域控制器使用这个hash值来加密challenge.
- 域控制器比较它自己加密的值和从客户端收来的加密的值. 如果它们是一样的, 那么认证成功.
- 域控制器发送一个信号给应用程序服务器, 告诉它说这个用户的认证成功了, 他是某某人. 应用程序服务器确认这个用户有权访问自己后, 于是开放某些资源给这个用户访问.
你的应用程不能直接访问NTLM security package, 取而代之的是, 它应该使用Negotiate security package. 如果authentication涉及到的操作系统允许的话, Negotiate 允许你的应用程序来使用高级security protocols的优势. 当前, Negotiate security package 的选择包括Kerberos 和NTLM两种. Negotiate 会选择Kerberos, 除非Kerberos不被牵扯到authentication的操作系统支持.
译自:
Microsoft NTLM
http://msdn.microsoft.com/en-us/library/aa378749(VS.85).aspx