最近搞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
... ...

这样,就无法拿到“入场券”,自然不能在第四回合中输入合法的串。

 

posted on 2004-08-05 16:29  yxp132  阅读(1427)  评论(1编辑  收藏  举报

导航