“ 介紹連信會話加密密鑰的協商過程。”
公号内之前已經對協定的架構和協定内的資料格式進行了介紹,有需要可以回顧下:
連信協定整體架構
連信的protobuf資料格式
本文對連信的會話加密密鑰協商過程進行介紹。
連信使用過程中,包括長連接配接和短連結内的資料,均使用AES CBC加密,而加密的密鑰key和向量iv,則是在登入即打開APP時進行協商,從伺服器下發。
連信登入過程分為兩種,第一種為之前在目前手機上沒有登入過,使用手機号進行登入,第二種為在目前手機上已經登入,儲存有驗證資訊。
01
—
auth_login登入
第一種在驗證碼之後,使用賬号進行登入驗證,iphone版使用的url是:
https://short.lianxinapp.com/webuic/auth/v13/auth_login.json
封包類似這樣:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iYlRDZkFTMmJmM2EWMjFGMlRmNhhzYlJTYhJWMlFzYk9CX5IzLcZDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.png)
請求部分的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
結束