揭秘安全通道协议

知识背景

业务客户端跟后端服务的协议为自定义的二进制协议,其中协议头中有一个2子节的字段,表示该请求包对应的功能(如0x825是调度功能的请求包),也称为命令字。

TLV是一种常用的用于通信的结构体格式。T表示tag(类型),L表示length(value的字节长度),V表示value。

Kerberos鉴权体系,基于票据的鉴权服务,避免密码相关数据直接过多地暴露在网络上。

使用标准的密码学算法,切勿自研加解密算法,算法是透明的,密钥才是保密的。

对称加密:加密和解密时使用的是同一个密钥。

非对称加密:需要两个密钥来进行加密和解密:公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥) ,公钥加密的信息只有私钥才能解开,私钥加密的信息只有公钥才能解开。

以下所有包的加密解密均为对称加密。

ECDH

ECDH基于ECC的DH(Diffie-Hellman)密钥交换协议,可以使通信双方在不安全信道协商一个共享密钥(A=aP,其中P是一个很大的素数。公钥A、私钥a),但是不防中间人攻击。

揭秘安全通道协议_第1张图片

揭秘安全通道协议_第2张图片

总架构图

揭秘安全通道协议_第3张图片

登录流程加解密方式

一、0x825调度

获取一台conn服务器ip,并开启后序的登录流程。相同的加解密方式命令字如二维码登录0x817、0x818,验证码0xba

上行包格式

K1 + 密文请求

密文请使用K1解密,不安全。里面带上了客户端的公钥A(A=aP),其中A、a是客户端随机生成的非对称密钥,每次登录不一样。

下行包格式

正常下行包使用K1 加密

错误提示语回包使用ECDH加密

因提示语涉及高敏感和安全风险,固采用ECDH协商秘钥加解密。ECDH服务器用b跟A作运算得到bA(baP)作为密钥加密0x825错误回包给客户端。其中B、b(B=bP)是根据客户端版本hardcode的一对非对称密钥(防中间人),每个版本不一样。当然服务器会保存相应版本及对应的B、b。客户端收到回包后拿hardcode在客户端的B跟a运算得到的密钥Ba(bPa)解服务器的回包。

二、0x836验密

验证密码(大大票)。

上行包格式

A + 包体(bA加密,含A1)

如果0x836上行使用ECDH加密,则需ECDH服务器算出密钥bA(baP)解密包体。同时ECDH服务器定时生成一对公私钥Cc(前向安全),返回C和ShareKey2(cA)给conn。

  • TAG_ID_TGTGT_SIG:大大票,由密码组装的包含自身信息的票据A1,客户端生成
  • S2 = md5(md5(pwd)+uin)
  • A1= TEA(S2, uin + time + md5(pwd) + randkey[16] + …) //用密钥S2和加密算法TEA加密内容。其中randkey也叫TGTGT_KEY。

下行包格式

conn生成的随机密钥1 + TLV(0x109,SessionSig用vaskey加密,里含有conn生成的随机密钥1)+ TLV(0x107,含TGT、ST,由DB加密生成的且包含随机密钥GTK_TGT )+ 其他

bA加密(C + ShareKey2加密(TGTGT_KEY加密(内容)))
客户端用Ba解包后得到C,然后用Ca解密,最后用TGTGT_KEY解密。TGTGT_KEY也叫randkey其实是客户端生成的随机密钥放在了A1中,由DB解密后返回给conn的。

  • TGTGT_KEY:客户端生成的随机Key,由DB解密后获取返回给conn的。
  • TGT:通过TGTGT登录后,由DB派发的高权限登录凭证。DB加密生成的TGT中包含随机密钥GTK_TGT
  • GTK_TGT:由DB生成的随机密钥
  • ST:业务小票,是通过TGT换取的一种业务票据,用于访问业务鉴权,权限较低

三、0x828登录

登录、分配和初始化用户信息。其中到DB校验大票成功后,会进入分配和初始化onlinelocal信息。设置状态值shStatus为5,conn会丢弃状态已为5的0x828请求,可防重放攻击。conn生成随机密钥2,拉取好友表等逻辑。

上行包格式

TLV(0x30,含SessionSig) + 随机密钥1(TLV,含大票TGT)
TLV使用vaskey解密后获取里面的conn生成的随机密钥1解密其余包体。

下行包格式

TLV(0x10c,含有conn随机密钥2) + TLV(0x14,心跳间隔60s,可配置)
GTK_TGT加密(0x828回包)。

往后所有的包的加解密均使用conn随机密钥2也叫sessionkey,该密钥存储在conn的onlinelocal里面,每个uin,每次登录均不一样。

四、0xec上线

上线,将用户的状态从5改为10上线并向同步系统同步状态。对于状态不为5,conn会丢包处理,可防重放。

使用随机秘钥2加解密

# 参考资料
http://blog.csdn.net/b2222505/article/details/72872202

你可能感兴趣的:(安全)