介绍NTLM 之前,简单看一下NetBIOS和SMB是什么
NetBIOS协议是由IBM公司开发,主要用于数十台计算机的小型局域网。NetBIOS协议是一种在局域网上的程序可以使用的应用程序编程接口(API),为程序提供了请求低级服务的统一的命令集,作用是为了给局域网提供网络以及其他特殊功能,几乎所有的局域网都是在NetBIOS协议的基础上工作的。
SMB(Server Message Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议。SMB 是在会话层(session layer)和表示层(presentation layer)以及小部分应用层(application layer)的协议。SMB使用了NetBIOS的应用程序接口 (Application Program Interface,简称API)。另外,它是一个开放性的协议,允许了协议扩展——使得它变得更大而且复杂;大约有65个最上层的作业,而每个作业都超过120个函数,甚至Windows NT也没有全部支持到,最近微软又把 SMB 改名为 CIFS(Common Internet File System),并且加入了许多新的特色。
早期SMB协议在网络上传输明文口令。后来出现 LAN Manager Challenge/Response 验证机制,简称LM,它是如此简单以至很容易就被破解。微软提出了WindowsNT挑战/响应验证机制,称之为NTLM。
现在已经有了更新的NTLMv2以及Kerberos验证体系。NTLM是windows早期安全协议,因向后兼容性而保留下来。NTLM是NT LAN Manager的缩写,即NT LAN管理器。
windows NT 系统大概是 微软1997年发表的,从Win2000开始默认协议为Kerboros。
Microsoft NTLM给出了NTLM详细介绍。
NTLM 验证分为交互式验证和非交互式验证两种。
交互式验证:
最典型的就是两个系统- 客户端请求验证; 域控制器端(保存了用户和密码的相关信息)
非交互式验证:
已经登录系统的用户去请求另一台服务器的资源,这里就涉及到三个系统了-- 客户端, 域控制器和服务器。
这两种状况的使用状况简单举例来说, 使用场景可以是:
交互式验证就是域帐号登录某台机器。
非交互式验证就是已经登录这台机器的用户,使用SSO的方式去访问某web server 上的网页。
详细的验证过程是:
Microsoft NTLM 中有提示:
不要直接使用NTLM,而是使用negotiate。如果使用negotiate的话,那么windows会判断kerberos是否可用,如果可用就优先使用kerberos,否则使用NTLM。kerberos的安全性要比NTLM要高。
NTLM HTTP认证
但在浏览器中使用NTLM验证的时,验证过程如下:
1: C --> S GET ...
2: C <-- S 401 Unauthorized
WW-Authenticate: NTLM
3: C --> S GET ...
Authorization: NTLM <base64-encoded type-1-message>
4: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM <base64-encoded type-2-message>
5: C --> S GET ...
Authorization: NTLM <base64-encoded type-3-message>
6: C <-- S 200 Ok
从交互过程可以发现,client会发送type-1消息和type-3消息给server,而server会发送type-2消息给client。
Type-1消息包括机器名、Domain等
Type-2消息包括server发出的NTLM challenge
Type-3消息包括用户名、机器名、Domain、以及两个根据server发出的challenge计算出的response,这里response是基于challenge和当前用户的登录密码计算而得
从这里可以看出, 不管是否域帐号验证成功与否, 都可以通过这种方式获取登录机器的域帐号。
如何获取可以参考(JSP版):
如果要使用jsp 实现域帐号验证实现SSO功能, 可以参考:
在IE里,上述的交互会由浏览器自动完成,M$总是有办法自己到OS里去拿到Domain、用户名、密码等等信息的,而FF就没有这么方便了,它必须要用户手工输入,当server返回401错误后,FF会弹出该对话框让用户输入用户名、密码(在IE中,如果使用当前登录的用户名、密码验证失败后也会弹出这样的对话框)
关于NTLM http 细节内容可以参考:
http://www.innovation.ch/personal/ronald/ntlm.html
http://davenport.sourceforge.net/ntlm.html#whatIsNtlm
SMB,也称为CIFS(Common Internet File System),CIFS协议的细节可以在MSDN上查到:
http://msdn2.microsoft.com/en-us/library/aa302240.aspx
NTLM认证是一个M$准备放弃的协议,在Windows 2000和以后的操作系统中,缺省的认证协议是Kerberos,只有在和2000之前的系统通信时才使用NTLM。当然这并不是说jCIFS在2000以上就用不起来了,缺省情况总是可以用的,M$总是要保持兼容的J 当然如果你想实现基于Kerberos的SSO