`

飞信分析之九:飞信登录时的身份验证

阅读更多

转载自:

http://hi.baidu.com/nathan2007/blog/item/10645631faa0951aeac4afc5.html

 

作者:nathan

好久没搞这个了,现在根据一些朋友提出的问题继续分析好了。:)

飞信的整个登录过程包括取系统配置、验证身分、取联系人、取离线消息等等一堆过程,这里就不细述了,下面主要说明到是一些朋友比较关心的身份验证是怎么做的。

飞信有两处验证身份,第一次是通过SSL向SSIPortal登录时,第二次是用SIP协议向Proxy Server注册时。

一、向SSIPortal登录

SSI是啥,我一直没弄明白,是Single Sign-In? 习惯上不是SSO(Single Sign-On)吗?反正飞信一开始,必须向nav.fetion.com.cn登录,这是飞信的Portal。登录过程其实很简单,就是通过SSL做一个的GET,请求是:
    https://nav.fetion.com.cn/ssiportal/SSIAppSignIn.aspx?mobileno=13XXXXXXXXX&pwd=XXXX
pwd就是这个用户的密码。服务器验证通过后,就会返回200 OK,Cookie中就有关键的SSIC了。SSIC应该是服务器给客户端的Credential,以后再跟服务器以Http的方式打交道,就必须带上这个Credential了,如下一步的可选操作Geturi:
    POST /hds/geturi.aspx HTTP/1.1
    User-Agent: IIC2.0/PC 2.1.0.0
    Host: 221.130.45.205
    Cookie: ssic=xxxxxxxxxxxxxxxx
    Content-Length: 0
    Connection: Keep-Alive

如果采用http方式而非tcp直连方式(连proxy server的8080端口),那么与服务器间的sip协议是用http承载的,每次都必须带上这个ssic。

这次登录除获得Credential外,还一个重要的作用就是获得用户的URI,即"sip:123456789@fetion.com.cn;p=xxxx".

二、向Proxy Server注册
完成上一步,就开始SIPC的交互过程了,首先用Register方法向Proxy Server注册,Proxy Server的地址(221.130.45.203)从哪来的,以前文章专门说过。

注册的过程是:
-----------------------------------------------------
xxx.xxx.xxx.xxx:xxx >>>>>>>> 221.130.45.203:8080

R fetion.com.cn SIP-C/2.0
F: 123456789
I: 1
Q: 1 R
L: 249

<args>.......</args>
-----------------------------------------------------
xxx.xxx.xxx.xxx:xxxx <<<<<<<< 221.130.45.203:8080

SIP-C/2.0 401 Unauthorized
I: 1
Q: 1 R
W: Digest algorithm="MD5-sess",nonce="xxxxxxxxxxxxxxxx"

-----------------------------------------------------
xxx.xxx.xxx.xxx:xxxx >>>>>>>> 221.130.45.203:8080

R fetion.com.cn SIP-C/2.0
F: 123456789
I: 1
Q: 2 R
A: Digest response="xxxxxxxxxxxxxxx",cnonce="xxxxxxxxxxxxxxxx"
L: 249

<args>......</args>
-----------------------------------------------------
xxx.xxx.xxx.xxx:xxxx <<<<<<<< 221.130.45.203:8080

SIP-C/2.0 200 OK
I: 1
Q: 2 R
X: 600
L: 877

<results>.....</results>


这是个标准的Digest Authentication验证过程,具体去看SIP或HTTP的文档好了:) 我们来关心"W"即WWWAuthenticate这个SIP Header Field,nonce是服务器给出的,那response和cnonce是怎么计算出来的呢?

计算response和cnonce需要用到sid(飞信号)、password、domain(fetion.com.cn或vodafone等用户所属域)、nonce。飞信计算cnonce是用了4个随机数组成一个16进制的字符串然后求这个字符串的MD5,responce的计算方法是:
1.求"sid:domain:passwd"这个utf8字符串的MD5值,得出key
2.求"key:nonce:cnonce"这个utf8字符串的MD5字符串,得出H1
3.求“REGISTER:sid"这个utf8字符串的MD5字符串,得出H2
4.求"H1:nonce:H2"这个utf8字符串的MD5字符串,即为response.


以上就是飞信的身分验证过程,我还没来得及写代码测试,应该就是这样子。另外,如果知道用户的URI,是否可以不用注册到SSIPortal?这个需要测试才知道,我看飞信中好象还对注册到SSIPortal的Session做了Keep Logon。

好啦,分析到现在我们可以做一个飞信的客户端了,哈,谁有兴趣? ;)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics