连信的会话加密密钥协商过程

点击上方蓝字[协议分析与还原]关注我们


 介绍连信会话加密密钥的协商过程。

公号内之前已经对协议的框架和协议内的数据格式进行了介绍,有需要可以回顾下:

连信协议整体框架

连信的protobuf数据格式

本文对连信的会话加密密钥协商过程进行介绍。

连信使用过程中,包括长连接和短链接内的数据,均使用AES CBC加密,而加密的密钥key和向量iv,则是在登录即打开APP时进行协商,从服务器下发。

连信登录过程分为两种,第一种为之前在当前手机上没有登录过,使用手机号进行登录,第二种为在当前手机上已经登录,保存有验证信息。

01

auth_login登录

第一种在验证码之后,使用账号进行登录验证,iphone版使用的url是:

https://short.lianxinapp.com/webuic/auth/v13/auth_login.json

报文类似这样:

请求部分的Content-Encrypted-ZX的值为1表示请求体加密,Content-CKey-Version表示RSA加密密钥的版本,Content-CKey内的内容为RSA加密的AES ECB密钥,请求体使用这个key加密。

请求体内的内容如下:

    dfp={
    "teamid":"",
    "isJailbreaking":False,
    "channel":channel,#"appstore",
    "simulator":"0",
    "dylib":"",
    "bundleid":bundleid,#"com.zenmen.palmchat",
    "resolution":resolution,#"640-1136",
    "ip":localip#"192.167.2.88"
    }
    dfpstr=json.dumps(dfp)


    payload={
        'channelId':channel,#'appstore',
        'idfa': idfa,
        'sdid':sdid,
        'deviceId': dhid,
        'hashKey': hashKey,
        'appList':'{}',
        'platform': Resource,#'iphone',
        'versionCode':vcode,#'200404',
        "did": dhid,
        "idfv": idfv,
        "authKey": authKey,
        "dfp":dfpstr
    }

Content-CKey内数据的RSA加密密钥根据Content-CKey-Version版本值不同而不同,其中一个版本为:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDhCalnroo3exCtNnDnk66dCGCiq/WVjYdwmlyPCubzRBD+0MZbQUpaZzWqguQ1XAxgFai/Qod+L0ALS7UptvXhCHxAY+Wh6mco876S9RDpMUcZvj0Ma1UK0o/StNvrJOOyZWRWQhXir/T93rkavKVu/VJqJFFOcq4sz9WqhjeDOwIDAQAB

当然,url内的版本vxx的值在RSA密钥不同时也有差异。

响应体解密后内容包括一些服务器上的信息和后续加密用的key和iv:

"{\n  \"resultCode\":0,\n  \"data\":{\n    \"uid\":\"490xxx92\",\n    \"skey\":\"kp1bppYcF1yA0W6Z\",\n    \"iv\":\"B5le192ZOPZZ2chq\",\n    \"sessionId\":\"34daxxx7e56b10fca16993\",\n    \t\"refreshKey\":\"iMvq3kwJXbQh0Wlt\",\n    \"account\":\"\",\n      \t\"nickname\":\"\u53e4\u53e4\u602a\u602a\",\n      \t\"pyInitial\":\"GGGG\",\n      \t\"pyQuanPin\":\"GuGuGuaiGuai\",\n    \"headImgUrl\":\"https://avatar.cdn.lianxinapp.com/avatar2/u/c/2020/5/1/e/a/1cbc07gefxxx7a63205f38f-q9nbqj.crop\",\n    \"headIconUrl\":\"https://avatar.cdn.lianxinapp.com/avatar2/u/c/2020/5/1/e/a/1cbc0xxx5af48e08f9357a63205f38f-q9nbqj_small.crop\",\n      \t\"signature\":\"\u5f53\u7136\",\n    \"ic\":\"1\",\n    \"privacyConfig\":\"0\",\n    \"phone\":\"438xxxx4\",\n    \"sex\":0,\n    \"country\":\"\",\n    \"province\":\"\",\n    \"city\":\"\",\n    \"birthday\":\"\",\n    \t\"age\":0,\n\t    \"hobby\":\"\",\n    \"email\":\"\",\n    \"syncKey\":\"1\",\n    \"version\":\"17030009\",\n    \"newUser\":1,\n    \"hintStyle\":0,\n    \"showUserStyle\":0,\n    \"exid\":\"V1qYdxxx-jn8gv\"\n  }\n}"

02

token登录

第二种在每次打开APP时进行登录验证,iphone版使用的url是:

https://short.lianxinapp.com/token/v10/ak

报文类似这样:

和auth_login登录一样,请求部分的Content-Encrypted-ZX的值为1表示请求体加密,Content-CKey-Version表示RSA加密密钥的版本,Content-CKey内的内容为RSA加密的AES ECB密钥,请求体使用这个key加密。

请求体内的内容如下:

    payload={
        'ckey':aesecbkey,
        'sessionId': sessionId,
        'sdid':sdid,
        'refreshKey': refreshKey
    }

Content-CKey内数据的RSA加密密钥与auth_login相同。

url内的版本vxx的值在RSA密钥不同时也有差异。

响应体解密后内容包括后续加密用的key和iv:

"{\"key\":\"LlGQmBfQurP1X13p\",\"iv\":\"uJt76oWLOlrvKV7z\",\"sync\":0,\"exid\":\"5d1kNyyPPxxxx1-JgG55\",\"resultCode\":0}"

这个过程相当于更新了一次key和iv,后续的数据加密均使用这对key和iv进行。

03

结束

密钥的协商过程就这样子,关键是找到RSA公钥,文中的公钥是连信ios版内的测试版公钥,为避免麻烦,它的正式公钥就不放了。

别忘点“在看”、“赞”和“分享”

新的规则,及时收推文要先给公号星标

别忘了星标一下,不然就错过了

长按进行关注,时刻进行交流。

猜你喜欢

转载自blog.csdn.net/yeyiqun/article/details/108191446