最近搞Msn通信看到几篇好文章,正在搞这方面的朋友,可以与我联系
MSN Messenger协议--身份认证
原作:bhw98
过去的MSN Messenger版本(MSNP8以下),简单地使用MD5等Hash算法对用户身份进行认证。MSNP9/MSNP10使用一种TWN(Tweener)认证方式,通过SSL/TLS连接到login.passport.com和loginnet.passport.com等服务器,借助于HTTP协议输入账号和密码,认证通过后,才能取得“入场券”。
真正意义上的身份认证,发生在客户端与通知服务器(NS)之间。客户端登陆NS时,首先交换版本信息。双方均支持MSNP8以上版本时,才能进行认证过程。如果客户端版本较低,不支持TWN,咋办?服务器会将你一脚揣出去,信不信?
好了,废话少说,现在拿一个成功认证的例子看看。在下面的例子中,账号是“example@passport.com”,密码是“password”。
VER 4 MSNP10 MSNP9 CVR0\r\n VER 4 MSNP9 CVR0\r\n CVR 5 0x0804 winnt 5.0 i386 MSNMSGR 6.1.0203 MSMSGS example@passport.com\r\n CVR 5 6.0.0602 6.0.0602 5.0.0527 http://download.microsoft.com/download/d/4/f/d4f560d5-6dc6-4901-b149-a568415561d7/SETUPNT.EXE http://messenger.msn.com/cn\r\n USR 6 TWN I example@passport.com\r\n USR 6 TWN S lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1073355862,kpp=1,kv=5,ver=2.1.0173.1, tpf=ed1c2f217a21c191c61251eb8b73bb60\r\n (此时通过SSL进行身份认证,获得“入场券”) USR 7 TWN S t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ &p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$\r\n USR 7 OK example@passport.com example@passport.com 1 0\r\n
第一回合(TrID=4),双方协商MSN版本号。客户端说“我能支持MSNP9和MSNP10”,NS说“行,就MSNP9吧”。
第二回合(TrID=5),客户端报告本机信息:OS = Windows 2000 (NT 5.0), 语言 = 简体中文,MSN Messenger版本 = 6.1.0203, 账号 = example@passport.com。NS给出了推荐的版本号,能够使用的最老的版本号,新版本下载地址,官方网站地址等信息。
第三回合(TrID=6),客户端要求身份认证(I = Initial),NS则给出所需要的一长串信息(S = Subsequent)。其中tpf相当于challenge,参与Hash运算,能保证每次认证返回的串是不同的。
第四回合(TrID=7),客户端出示从认证服务器得到的“入场券”,NS放行(OK)。
第三、四回合之间,通过SSL的认证过程如下:
首先在HTTPS端口443向login.passport.com发送一个GET请求,将账号、密码和NS给定的一长串信息送出
GET /login2.srf HTTP/1.1\r\n Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=example%40passport.com,pwd=password, lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1073355862,kpp=1,kv=5,ver=2.1.0173.1, tpf=ed1c2f217a21c191c61251eb8b73bb60\r\n Host: login.passport.com\r\n \r\n
根据情况,会重定向到不同的URL。本例中,重定向到"https://loginnet.passport.com/login2.srf?lc=1033",服务器应答
HTTP/1.1 302 Found\r\n Server: Microsoft-IIS/5.0\r\n Date: Mon, 22 Dec 2003 21:10:05 GMT\r\n PPServer: H: LAWPPLOG5C006\r\n Connection: close\r\n Content-Type: text/html\r\n Expires: Mon, 22 Jun 2003 21:09:05 GMT\r\n Cache-Control: no-cache\r\n cachecontrol: no-store\r\n Pragma: no-cache\r\n P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"\r\n Authentication-Info: Passport1.4 da-status=redir\r\n Location: https://loginnet.passport.com/login2.srf?lc=1033\r\n \r\n ... ...
然后,重新向指定的URL发出请求,得到如下响应
HTTP/1.1 200 OK\r\n Server: Microsoft-IIS/5.0\r\n Date: Mon, 22 Dec 2003 21:10:07 GMT\r\n PPServer: H: LAWPPIIS6B061\r\n Connection: close\r\n Content-Type: text/html\r\n Expires: Mon, 22 Dec 2003 21:09:07 GMT\r\n Cache-Control: no-cache\r\n cachecontrol: no-store\r\n Pragma: no-cache\r\n P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"\r\n Set-Cookie: ... ...\r\n Authentication-Info: Passport1.4 da-status=success,tname=MSPAuth,tname=MSPProf,tname=MSPSec, from-PP='t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ &p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$', ru=http://messenger.msn.com\r\n Content-Length: 0\r\n \r\n
开始时直接向loginnet.passport.com发出正确的请求,也是可以的。不难看出,在服务器认证成功的返回信息中,Authentication-Info字段的from-PP串值,就是所谓的“入场券”。
如果认证失败,服务器返回401错误
HTTP/1.1 401 Unauthorized\r\n ... ...
这样,就无法拿到“入场券”,自然不能在第四回合中输入合法的串。