飞信2010分析 – SSI登录

2010年4月1日 | 分类: 飞信哪些事儿 | 标签:

一个月前,移动飞信发布了飞信2010版,也就是V3.6版(飞信2008版为V3.5),并升级了飞信的通信协议。飞信2010版最显著的功能更新就是非移动用户也可以使用飞信了,只需使用一个邮箱注册即可。但限制还是比较多的,只能已经开通飞信的人发送消息,注意不是短信,当该用户不在线的时候以离线的消息发送。但可以每个月可以免费发送三条短信,如果要发送更多,还得绑定手机号。。

其实很早就想写关于飞信2010版的内容。在飞信2010发布没几天我就开始分析SSI登录和SIPC验证。SSI登录很快就搞定了,但SIPC验证总是失败。查了很久都没有结果,于是就放了有两周吧。两周后的某一天实在是无聊,翻出以前分析飞信2010的代码,拖出Reflector和VC# Express又分析一通,总算搞定了。。网上关于飞信2010的资料还少,我还是简单的写出来,和大家分享我的飞信的研究心得吧,如果我说得不对,别拍我板砖哈~~

废话少说,简单说下飞信2010版协议的变化:
1、SSi登录使用新的V4版本,地址是:https://uid.fetion.com.cn/ssiportal/SSIAppSignInV4.aspx
2、飞信通信协议版本升级为 SIP/C-4.0,主要的操作协议已经是V4了,比如GetContactInfoV4
3、通信协议中很多地方为了减少流量都简写了,比如presence简写为pr,local-name 简写为l

飞信登录其实是分三步的:第一步获取自适应的系统配置,第二步:SSI登录,第三步:SIPC登录验证。

先说一下第一步,获取自适应的系统配置。

自适应的配置包含了很多和飞信客户端有关的信息。其中里面最重要的一个信息就是飞信服务器的地址。不同的地方的飞信用户登录到了不同的飞信服务器。比如四川的飞信的用户就登录到四川的飞信服务器上。至于为什么需要登录到本地的飞信服务器上,我个人觉得从技术上来说可能是做负载均衡,从运营上来说可能是不同的省的移动子公司的运营方式不同。

完成获取自适应的配置其实很简单,做一个简单的HTTP POST就行了。地址是固定的。参数大部分也是固定的。

地址为http://nav.fetion.com.cn/nav/getsystemconfig.aspx,POST的内容如下

展开源代码查看源代码

打印关于

1.<config><user mobile-no="159xxxxxxxx" /><client type="PC" version="3.6.2000" platform="W5.1" /><servers version="0" /><service-no version="0" /><parameters version="0" /><hints version="0" /><http-applications version="0" /><client-config version="0" /><services version="0" /></config>

如果模拟飞信客户端登录,只需改变一下mobile-no,其他可以全不变。

展开源代码查看源代码

打印关于

01.POST /nav/getsystemconfig.aspx HTTP/1.1
02.User-Agent: IIC2.0/PC 3.6.1860
03.Host: nav.fetion.com.cn
04.Content-Length: 286
05.Connection: Close
06.
07.<config><user mobile-no="159xxxxxx" /><client type="PC" version="3.6.1860" platform="W5.1" /><servers version="0" /><service-no version="0" /><parameters version="0" /><hints version="0" /><http-applications version="0" /><client-config version="0" /><services version="0" /></config>
08.
09.HTTP/1.1 200 OK
10.Connection: close
11.Date: Thu, 04 Mar 2010 15:22:04 GMT
12.Server: Microsoft-IIS/6.0
13.X-Powered-By: ASP.NET
14.X-AspNet-Version: 2.0.50727
15.Cache-Control: private
16.Content-Type: text/html; charset=utf-8
17.Content-Length: 13319
18.
19.<?xml version="1.0" encoding="utf-8" ?>
20.<config  carrier="CMCC">
21. <servers version="117">
22.  <ssi-app-sign-in-v2>https://uid.fetion.com.cn/ssiportal/SSIAppSignInV4.aspx<;/ssi-app-sign-in-v2>
23.  <get-pic-code>http://nav.fetion.com.cn/nav/GetPicCodeV4.aspx<;/get-pic-code>
24.  <web-cm-service-url>http://www.sc.chinamobile.com<;/web-cm-service-url>
25.  <sipc-proxy>221.130.46.141:8080</sipc-proxy>
26.  <sipc-ssl-proxy>221.130.46.141:443</sipc-ssl-proxy>
27.  <http-tunnel>HTTP://221.130.46.141/ht/sd.aspx<;/http-tunnel>
28.  <get-uri>http://hdss1cska.fetion.com.cn/HDS_Pool05/geturi.aspx<;/get-uri>
29.  <sub-service>https://nav.fetion.com.cn/nav/Subscribe.aspx<;/sub-service>
30.  <ssi-app-sign-in>https://uid.fetion.com.cn/ssiportal/SSIAppSignIn.aspx<;/ssi-app-sign-in>
31.  <ssi-app-sign-out>http://ssi.fetion.com.cn/ssiportal/SSIAppSignOut.aspx<;/ssi-app-sign-out>
32. ..
33. </server>
34....
35.</config>

下面开始分析飞信2010版的SSi登录部分。
什么是SSI呢? 我个人理解就是Single Sign-In,就是单点登录。
做过大型网站都会存在这样一个问题,网站有很多的应用,但都需要用户登录验证时才能使用服务。但往往这些应用都在不同的服务器,一个用户登录了这个应用,但打开另一个应用却又需要用户登录验证,因为在不同的服务器,彼此之间是独立的状态。为了达到用户在一个应用登录之后就可以自动的登录其他的应用,可以设置一个专一登录服务器,如果用户登录之后,就把这个状态推送到各个应用服务器,或者应用服务器在用户访问的时候主动向登录服务器询问当前用户是否登录。这个实现方法可以不同。

飞信应该采用的是第二种实现方案。飞信其实是一种混合多种软件体系结构的一个软件。比如飞信客户端通信采用的C/S软件体系结构,而获取用户头像,传输文件等却又是面向SOA的软件体系结构(如HTTP,SOAP,REST,飞信是用的HTTP建立的应用)。为了在这不同的软件体系结构共享用户状态,就必须要设置一个登录服务器来完成用户登录操作,然后返回一个用户标志,这就是SSIC(Single Sign-In Credential),比如获取用户定义的头像,事实上就是一个HTTP的应用,但HTTP是无状态的,如何让服务器判断这个请求是否合法呢?这里就需要把SSI登录成功的SSIC作为Cookie传递给服务器帮助判断请求是否合法。如果是基于HTTP传输模式的话,这个SSIC是放在Cookie中的。

飞信是怎么实现SSI的呢?其实很简单,做个HTTPS的GET就行了。在飞信2006的时候,使用的SignV1就直接把用户手机号和原始密码作为两个参数传递过去就行了,但飞信2008的就用了SignV2,新增了验证图片验证,可以防止恶意程序猜测密码,并且支持把密码加密后作为digest传递过去,保障了安全性。到飞信2010启用了SignV4验证,同样有验证码验证,并且改变了密码的加密方式。

下面就详细的说明飞信2010采用的SignV4的SSI登录的过程和加密方法。
SSI登录的地址是:https://uid.fetion.com.cn/ssiportal/SSIAppSignInV4.aspx
简单的说下参数,以GET方式传递,就目前发现的有八个
mobile:手机号
sid:飞信号
domains:获取SSIC的域名,不同的域名以分号(;)分开。不同的域名的SSIC是不同的,这里飞信客户端默认传递了三个域名:fetion.com.cn%3bm161.com.cn%3bwww.ikuwa.cn这三个域好像都是移动的域名。。
v4digest-type:加密的方式。可以取两个值 1:V4Temp,2:V4
v4digest:加密后的密码,以16进制表示,20字节
pid:验证码图片编号
pic:用户输入的验证码
algorithm:图片生成算法(这个待验证,我觉得更像是验证原因…)

其中飞信号和手机号有且只能有一个,必须的。(这两个参数都传递是什么结果我还没试过呢)。
domains也是必须的,默认值为fetion.com.cn%3bm161.com.cn%3bwww.ikuwa.cn
v4digest-type和V4digest也是必须的。
下面的三个参数:pid,pic,algorithm只有在需要用户输入验证码验证才有效,而且三者都是必须的。如果不需验证,则可以不传递。

当v4digest-type=1时,v4digest的算法很简单,就是把 字符串 “fetion.com.cn:”的UTF8编码的字节数组和用户明文密码的UTF8字节编码数组连接在一起,然后计算SHA1的值就是加密结果。
主要加密代码如下:

展开源代码查看源代码

打印关于

1.public static String encryptV4(String plainpass)
2.{
3.    return doHash(ConvertHelper.string2Byte("fetion.com.cn:"), ConvertHelper.string2Byte(plainpass));
4.}

当v4digest-type=2 时,v4digest的算法就需要用到userid和v4digest-type=1时加密密码后的结果。userid是一个整型数,把userid转换为字节数组,注意低字节在前。然后和用v4digest-type=1时加密结果转换为字节数组连接在一起,再计算SHA1的值就是加密结果了。 主要加密代码如下:

展开源代码查看源代码

打印关于

1.public static String encryptV4(int userid, String plainpass)
2.{
3.    String passHex  = encryptV4(plainpass);
4.    return doHash(ConvertHelper.int2Byte(userid), ConvertHelper.hexString2ByteNoSpace(passHex));
5.}

这是加密用的工具函数,就是把两个字节数组合成一个数组然后计算这个数组的SHA1的值,返回的是16进制的字节字符串

展开源代码查看源代码

打印关于

1.private static String doHash(byte[] b1, byte[] b2)
2.{
3.    byte [] dst = new byte[b1.length+b2.length];
4.    System.arraycopy(b1, 0, dst, 0, b1.length);
5.    System.arraycopy(b2, 0, dst, b1.length, b2.length);
6.    byte[] res = DigestHelper.SHA1(dst);
7.    return ConvertHelper.byte2HexStringWithoutSpace(res);
8.}

当然用户第一次登录时只有飞信号或者手机号,所以就直接使用v4digest-type=1加密方法就行了,但如果知道了用户的userid就可以使用v4digest-type=2的加密方式了,比如登录成功之后网络断了的重登录。 如果服务器返回的状态码是200,表明验证成功,这个时候就会传回用户的uri,userid,还有最重要的ssic,注意这个ssic是作为一个cookie返回的,并没有在返回的正文中。其他的数据我也还没有分析,不过是XML的,很容易理解,这里不说了。 当然服务器可能会返回其他的状态码,这里列出一部分。

401:密码错误;
420:输入的验证码不正确;
421:当前登录的用户需要图片验证;
424:登录尝试超过规定次数;
431:用户正在更换飞信号,暂时无法登陆
432:用户已启用新的飞信号,当前飞信号已停止使用
435:您未绑定安全邮箱或手机号

展开源代码查看源代码

打印关于

01.GET /ssiportal/SSIAppSignInV4.aspx?mobileno=159xxxxxx&domains=fetion.com.cn%3bm161.com.cn%3bwww.ikuwa.cn&v4digest-type=1&v4digest=66F6B084EC004E25078CF6626AF05E881403C27E HTTP/1.1
02.User-Agent: IIC2.0/PC 3.6.2000
03.Host: uid.fetion.com.cn
04.Connection: Keep-Alive
05.
06.HTTP/1.1 200 OK
07.Date: Sat, 03 Apr 2010 08:39:11 GMT
08.Server: Microsoft-IIS/6.0
09.X-Powered-By: ASP.NET
10.X-AspNet-Version: 2.0.50727
11.Set-Cookie: ssic=DhIOAABEcX+O5EqnUrCfZQD2/PYXJ12j8mxBOzEiWMJiRzhlfqVrxprxQJcNhAvtusbjSqsJtUq9bX4D+POJlWEyXWDFkCbfR0qwJCbj6z0HnylkvjJ5GkiwMFAVA3bVD8AAeJ0AAA==; path=/
12.Cache-Control: private
13.Content-Type: text/html; charset=utf-8
14.Content-Length: 714
15.
16.<?xml version="1.0" encoding="utf-8" ?>
17.<results status-code="200">
18. <user uri="sip:123456789@fetion.com.cn;p=6721" mobile-no="159xxxxx" user-status="101" user-id="987654321">
19. <credentials>
20.  <credential domain="fetion.com.cn" c="CBIOAABAyrAQQWMLS1Ze6Auwn01TCYTf4zAc9KVcfkQMWc1hrQrkhe1vXI9xYrrSQUDfK5Ys/af/zLYdK2iwvSmELkTj2sBBtEL1w5vpLguHLWyH5I6+OkRM7nP9+l6PEiQi2eQAAA==" /><credential domain="m161.com.cn" c="CRAOAAA4C0dsXXdiP82bkjsB9aGA1L1wNAaXmqddFRx04Dk7uDCZMyri+OTJdwbTMQF0cckDbSgHVNEkcYBIGc8NJspEPxWzykMOGli8/m+mStMo2w==" /><credential domain="<a href="http://www.ikuwa.cn">www.ikuwa.cn</a>" c="CBAOAADDAL1rw2Z0QfyhPSiV/g6BkYjWdCyjDMKKqk3RAWETHRVdH3VwLRxD23TMwrCQ2Hk4LBAieDPC4h2RfK3uTLlKysCd62ZZ44cuth7iiThXtA==" />
21. </credentials>
22. </user>
23.</results>

当SSI登录时返回了421,当前登录操作就需要验证图片验证。新版V4的协议在SIPC验证注册的过程中也加入的图片验证的过程,获取验证图片也是同样的地址。

验证图片的获取是用另外的URL,地址是http://nav.fetion.com.cn/nav/GetPicCodeV4.aspx。方法为GET。

参数就一个,就是验证图片的算法。(从字面上来说是这样,但这里说的可能不准确,我感觉应该是获取验证码的原因。。)
目前可能的取值为:picc-ChangeMachine,picc-PasswordErrorMax。不过不用担心,这个参数在需要验证的时候都可以得到,比如SSI登录的时候,需要验证的时候通常都会把这个参数写入返回的结果里,请各位自行分析了,很简单。

直接发起这样的HTTP请求然后就可以获得验证图片信息。返回的是XML,很容易读取,其中/results/pic-certificate@id就是图片的编号,以后服务器验证用户输入是否正确就需要这个图片编号。/results/pic-certificate@pic就是经过base64编码过后的图片,应该是png格式的。使用base64解码过后就是图片的二进制代码,保存至文件或者渲染到图片框里就可以了。

展开源代码查看源代码

打印关于

01.GET /nav/GetPicCodeV4.aspx?algorithm=picc-ChangeMachine HTTP/1.1
02.User-Agent: IIC2.0/PC 3.6.1860
03.Host: nav.fetion.com.cn
04.
05.HTTP/1.1 200 OK
06.Date: Thu, 04 Mar 2010 15:22:08 GMT
07.Server: Microsoft-IIS/6.0
08.X-Powered-By: ASP.NET
09.X-AspNet-Version: 2.0.50727
10.Cache-Control: private
11.Content-Type: text/html; charset=utf-8
12.Content-Length: 3113
13.
14.<?xml version="1.0" encoding="UTF-8"?>
15.<results>
16. <pic-certificate id="ffe70af4-9748-46ce-ba94-0a900da0674d" pic="/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGB......." />
17.</results>

注意这里一定要设置User-Agent: IIC2.0/PC 3.6.2000,不然会出错。

飞信2010版的SSI登录分析到这,下篇文章分析SIPC 验证和注册。

飞信2010分析 – SSI登录相关推荐

  1. 飞信2010分析 – 成功登录之后

    飞信2010分析 – 成功登录之后 2010年4月12日  | 分类: 飞信哪些事儿  | 标签: 文章更新晚了,请大家见谅,上周的事情比较多,呵呵~ 标题里面的成功登录之后指的是SIPC验证成功之后 ...

  2. 飞信2010分析 – 给离线好友发送消息

    飞信2010分析 – 给离线好友发送消息 2010年4月21日  | 分类: 飞信哪些事儿  | 标签: 今天发这篇文章刚好是全国哀悼玉树地震的中遇难的日子,整个互联网都很悲伤.的确,我也是亲身经历过 ...

  3. amazeui页面分析之登录页面

    amazeui页面分析之登录页面 一.总结 1.tpl命名空间:tpl命名空间的样式都是从app.css里面来的,app.css用用来移动网站开发的样式 2.表单样式:am-form到am-form- ...

  4. Lync 2010客户端无法登录Lync server 2013服务器的解决办法

    Lync 2010客户端无法登录Lync server 2013服务器的解决办法 我的Lync server 2013环境介绍 内部域名contoso.com,外部域为tiancang.net, 两个 ...

  5. ssh被暴力猜解登录密码,利用pandas简单分析ssh登录失败记录

    本人为了学习和使用VPS因此手中长期配置一到两台VPS,没想到这点苍蝇肉也成了黑客眼里的肥肉. 近来一个月发现被人正在暴力猜解ssh登录密码,心想,这准是有人想要拿shell想要把这点苍蝇肉都想占为己 ...

  6. Fetion(飞信) 2010版本协议分析

    协议分析: http://www.liuhuadong.com/archives/867/index.html http://basiccoder.com/fetion2010-login-proto ...

  7. 分析单点登录cas的解决方式

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  8. 网页微信协议分析(一)——登录

    参考:https://www.52pojie.cn/thread-836149-1-1.html 1,先分析二维码,多次刷新页面对比,红色部分属于变动的参数 二维码请求地址:https://login ...

  9. 分析单点登录(流程图与数据安全)

    原文:[原创]单点登陆(SSO)组件的设计与实现一      最新修改:SSO子站点间状态管理问题.08-6-12      最新修改:完善SSO安全问题.08-6-11           去年公司 ...

最新文章

  1. 剑指offer--3题
  2. Windows Server基础架构云参考架构:硬件之上的设计
  3. 每日一皮:别放弃,再坚持一下就到成功的彼岸...
  4. 每日一皮:当我看到Bug背后的一切...我退缩了...
  5. Git使用汇总之工作区、暂存区、版本库
  6. C语言0xc0000142错误,第一次用c++编译器出现奇怪的报错
  7. W3 Total Cache+Hacklog Remote Attachment Upyun
  8. 一步步创建第一个Docker App —— 4. 部署应用
  9. 你需要知道的基础算法知识——STL和基础数据结构(一)
  10. 在Windows上安装Python
  11. QuickTest Professionar 快捷键
  12. python 特征选择卡方_4. 机器学习之特征选择-Python代码
  13. JAVA ftps设置_如何使用apache.commons.net.ftps配置客户端身份验证?
  14. curl怎么输出赋值_伺服电动缸怎么控制?
  15. 计算机硬件连接子系统,网络综合布线七大子系统详细讲解
  16. jeecms 取附件
  17. python中模块和包是什么_python的模块和包的详细说明
  18. 神经网络 和 NLP —— 语言模型和词向量
  19. 第二次练车,练了一天倒库
  20. 【Day27 文献泛读】物体位置与空间关系的心理表征

热门文章

  1. @4-1 CCF 2020-06-1 线性分类器
  2. 进化计算原理和实现(遗传算法)
  3. python -- 基础知识
  4. Win10系统Anaconda下安装TensorFlow、Karas和PyTorch
  5. win10子系统ubuntu18安装到其他盘
  6. Algorithm - Bubble Sort(Java)
  7. 【网络】mesh和无线桥接WDS的区别
  8. python3 opencv 图象灰度化处理
  9. android listview适配器使用,android – 使用适配器在Listview中填充Listview
  10. [Java]Mybatis学习笔记(动力节点老杜)