飞信2010协议分析(转)

(转载自basic coder
飞信2010出了有一段时间了,但到现在也只是beta版,所以就没 怎么关注它,今天下载了一个分析了一下它的协议,才发现飞信迟迟不推出新版本是因为它的协议有了比较大的变动,似乎想要把我们这些山寨货赶尽杀绝,也就是 传说中的V4版本的协议,很多信令后面都加上了V4标志,这也意味着想要适应2010,协议部分就必须重写。
飞信的登录协议比以前的版本有了显著的变化,最明显的变化在于它对登录信息的加密处理上,旧版本的飞信登录信息的加密让人看起来有点小儿科,把几个 字段这样加起来做散列,然后再那样加起来做散列,来来回回折腾最后得出一个response传回服务器验证。
2010的登录信息处理采用了非对称加密RSA算法。先贴几个抓出来的协议包吧:
1.SSI登录
SSI登录仍然采用了https登录,登录服务器应该没变,还是uid.fetion.com.cn。登录参数变了,加上必须的参数uri如下:

https://uid.fetion.com.cn/ssiportal/SSIAppSignInV4.aspx?mobileno=1348888888&&domains=fetion.com.cn%3bm161.com.cn%3bwww.ikuwa.cn&&v4digest-type=2&v4digest=password

注意:这里的密码也不再是v3里面的明文密码了,呵呵。
其中demains里面有三个域名,第一个应该是必须的,后两个不知道是哪家第三方的公司的域名,估计可以去掉,v4digest-type是密码 类型,有如下定义:

1
2
3
4
5
6
public enum PasswordTypeEnum
{
    V3,
    V4Temp,
    V4
}

v4digest就是密码了,然后还有一些可选参数像algorithm之类的我也就没细看它的功能。
2.sipC注册

R fetion.com.cn SIP-C/4.0
F: 916098834
I: 1
Q: 1 R
CN: 1CF1A05B2DD0281755997ADC70F82B16
CL: type=”pc” ,version=”3.6.1900″

这是sipC注册信息,CN就是旧版本里的cnouce , CL就是客户端信息了。服务器收到后回复信令:

SIP-C/4.0 401 Unauthoried
F: 916098834
I: 1
Q: 1 R
W: Digest algorithm=”SHA1-sess-
v4″,nonce=”389CE97D594B290366DCD4CC2DA5368D”,key=”D84CA40D849FEF3B45F02BBA6900D2A1B3010001″,signature=”62F5BA9D9146D477CDECAE1FD47098D0CABBFD31D683B5223B5D52″

为了节约篇幅key和signature的内容我都删去了一部分,key就是共享密钥,这个用来对验证信息做非对称加密用的,signature是 签名,用来对密钥信息做验证的。
3.sipC验证

R fetion.com.cn SIP-C/4.0
F: 916098834
I: 1
Q: 2 R
A: Digest
response=”5041619340F10D101149E45A8E2343294E8D5F4F5086C24703EE00CAA4DF8F9D2951E9F285C458F556
7454F5C35084A8CB7C5E3AA8D31D1FC3B9DD7CF395631E5EDE73E2E683D54C9E521443D31792E18B81CA26542BF5
79F662459CD5F6E4C0EC29767B6C5F775C10AF19B544B6957AC98FF6A420C7486BE68837A576036118″,algorith
m=”SHA1-sess-v4″
AK: ak-value
L: 426

消息体里面的xml信息就不贴出来了。最关键的部分是通信sipC注册返回的信息来计算这个response,计算response共需要用到4个 参数,publickey,nouce,password,aeskey.
publickey刚才注册返回的key值。
nouce 注册返回的nouce值。
password用户密码。
aeskey 用户通过 Rijndael算法生成的AES串。

response的计算规则是:
1.str = nouce + password + aeskey
2.对str进行RSA非对称加密,RSA算法具体细节我不懂,不过查看了一个微软MSDN了也大体知道是怎么工作的,它在计算的时候需要 Exponent(e,公钥指数),Modulus(n , 模),D (d , 私钥指数),不过我看飞信在传递RSA参数的时候只是指定了e和n,e是截取了公钥的前256的字符,n是截取了公钥的256个以后的字符。
3.通过2计算出来的参数对str进行加密,得到的就是response值。

将验证信令发送到服务器之后服务器会返回用户的详细信息,这与之前的版本之比也是一大改进,省去了再额外构造信令去GetPersonalInfo
另外,新版本的协议在获取用户信息上改动也很大,sipC验证完成后用户个人信息和联系人列表就会随返回消息一同发过来,旧版本会先发送 GetContactList信息获取用户列表,然后再构造一个庞大的Subscription去订阅这些用户的消息,新版本将这些完全简化了,发送如下 一条信令就可以订阅所有用户的信息,用户信息就会被一条一条地推送过来。

SUB fetion.com.cn SIP-C/4.0
F: 916098834
I: 8
Q: 1 SUB
N: PresenceV4
L: 95

<args>
<subscription self="v4default;mail-count" buddy="v4default" version="320595567" />
</args>

格式如下:

BN 916098834 SIP-C/4.0
N: PresenceV4
I: 1
L: 190
Q: 5 BN

<events>
    <event type="PresenceChanged">
        <contacts>
            <c id="601820518"><pr di="" b="0" d="" dt="" dc="0"/></c>
            <c id="464997176"><pr di="" b="0" d="" dt="" dc="0"/></c>
        </contacts>
    </event>
</events>

将字段名称也简化了,这样有助于在数据传输时候节省字节数,效率会更高一些。
OK,重要的变化差不多也就这些了,真要动手去写的话也够我忙活一阵子的了,现在没那么多时间了,要老老实实专心做项目了,2010到现在也只是个 beta版,我先静观其变吧,免得做无用功。