天天看點

連信的會話加密密鑰協商過程連信的protobuf資料格式

“ 介紹連信會話加密密鑰的協商過程。”

公号内之前已經對協定的架構和協定内的資料格式進行了介紹,有需要可以回顧下:

連信協定整體架構

連信的protobuf資料格式

本文對連信的會話加密密鑰協商過程進行介紹。

連信使用過程中,包括長連接配接和短連結内的資料,均使用AES CBC加密,而加密的密鑰key和向量iv,則是在登入即打開APP時進行協商,從伺服器下發。

連信登入過程分為兩種,第一種為之前在目前手機上沒有登入過,使用手機号進行登入,第二種為在目前手機上已經登入,儲存有驗證資訊。

01

auth_login登入

第一種在驗證碼之後,使用賬号進行登入驗證,iphone版使用的url是:

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

封包類似這樣:

連信的會話加密密鑰協商過程連信的protobuf資料格式

請求部分的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

連信的會話加密密鑰協商過程連信的protobuf資料格式

和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

結束