NTLM 协议

来源

介绍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。


NTLM 验证过程

 Microsoft NTLM给出了NTLM详细介绍。

NTLM 验证分为交互式验证和非交互式验证两种。

交互式验证:

    最典型的就是两个系统- 客户端请求验证; 域控制器端(保存了用户和密码的相关信息)

非交互式验证:

     已经登录系统的用户去请求另一台服务器的资源,这里就涉及到三个系统了-- 客户端, 域控制器和服务器。

这两种状况的使用状况简单举例来说, 使用场景可以是:

交互式验证就是域帐号登录某台机器。

非交互式验证就是已经登录这台机器的用户,使用SSO的方式去访问某web server 上的网页。

详细的验证过程是:

  1. (此步只有交互式验证需要)用户登录时输入的user name、password和domain name,然后Client端计算password的hash值并保存在本地
  2. 客户端将user name的明文发送给DC
  3. DC生成一个16-byte的随机数,叫做challenge,传输给client
  4. client收到challenge以后,在复制一份拷贝,然后将其中一个challenge用password hash加密,这个叫做response,然后将challenge,response以及user name传送给server
  5. server端在收到client传送过来的三份内容以后将它们转发给DC
  6. DC在收到user name,response,challenge以后,根据user name在account database中找到其对应的password hash,然后用这个password hash加密challenge
  7. 最后一步是客户端将response跟加密后的challenge进行比较,如果相同则NTLM验证成功。

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版):

java web 项目如何获取客户端机器信息


如果要使用jsp 实现域帐号验证实现SSO功能, 可以参考:

Java Web 项目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。当然这并不是说jCIFS2000以上就用不起来了,缺省情况总是可以用的,M$总是要保持兼容的J 当然如果你想实现基于KerberosSSO




  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oscar999

送以玫瑰,手留余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值