这段东西不是为了说明QQ的通讯细节,重点是通讯本身的安全机制。这是可以学习借鉴的部分
QQ通讯能保证:即使你知道整个QQ通讯细节,并能截取别人的通讯包时,也不能获得通讯的内容(除非你有对方的登录密码)。
QQ通讯安全机制核心在于登录机制
登录机制中
发送包
QQ密码不可截取,QQ密码采用两次MD5加密。服务器通过QQ密码的两次md5来比对包中的
接收包
接收包的内容须用QQ登录密码解密。解密获得以后通讯的新密码,该新密码应该是动态的。
一、通讯包
A. 发送包
1。包头
包头格式:
包体长度 2字节
包Tag 1字节 常量
version 2字节
command 2字节
sequence 2字节
QQ号码 4字节
说明:所有包的包头都是明码
2。包体
包体都是加密的,在不同时段,加密的方式、加密的密码有一定的变化,具体的加密方式看下一段
B.接收包
1。包头
包头格式:
包体长度 2字节
包Tag 1字节 常量
version 2字节
command 2字节
sequence 2字节
2。包体
包体以QQ_PACKET_TAIL(0x03)作为结尾,一般都是加密的,在不同时段,加密的方式、加密的密码有一定的变化,具体的加密方式看下一段
二、通讯过程
1。请求登录令牌:
向服务器发送请求也就是发一个请求登录令牌的包,服务器返回LoginToken(登录令牌)
发送包的细节:此包为明包,所有包头遵循统一规格,包体为空
包头:
名称 | 长度 | 值 |
包体长度 | 2字节 | 0 |
包Tag | 1字节 | 0x02 |
version | 2字节 | 不同QQ版本值不同(常量) |
command | 2字节 | 0x0062 |
sequence | 2字节 | 可自定义起始值 |
QQ号码 | 4字节 | 空 |
返回包:
包头:
名称 | 长度 |
包体长度 | 2字节 |
包Tag | 1字节 |
version | 2字节 |
command | 2字节 |
sequence | 2字节 |
包体:以QQ_PACKET_TAIL(0x03)作为结尾。
包体没有加密,包体的第一个字节是响应的值,正常应该为0,包体的第二个字节为登录令牌的长度。登录令牌从包体的第三个字节开始,长度为第二个字节内的值。
2.登录
发送包:
包体:
16字节初始key
encrypt( encrypt(NULL,0,doMd5Md5(passwordkey) )+36字节常量+LoginMode+16字节常量+登录令牌+100字节常量+补齐0)
返回响应包,包括SessionKey,FileSessionKey,FileShareToken,ClientKey等
3.根据Sessionkey处理相应消息包(发送的IM包,接收系统消息包)