微信小程式API 使用者資料的簽章驗證與加解密


使用者資料的簽章驗證與加解密


資料簽章校驗

為了確保 開放介面 傳回使用者資料的安全性,微信會對明文資料進行簽章。開發者可以根據業務需求對資料包進行簽章校驗,確保資料的完整性。

  1. 簽署校驗演算法涉及使用者的session_key,透過 wx.login 登入流程取得使用者session_key,並自行維護與應用自身登入態的對應關係。
  2. 透過呼叫介面(如wx.getUserInfo)取得資料時,介面會同時傳回rawData、signature,其中signature = sha1( rawData + session_key )
  3. #開發者將signature、rawData 傳送到開發者伺服器進行校驗。伺服器利用使用者對應的 session_key 使用相同的演算法計算出簽章 signature2 ,比對 signature 與 signature2 即可校驗資料的完整性。

如wx.getUserInfo的資料校驗:

#介面傳回的rawData:

{
  "nickName": "Band",
  "gender": 1,
  "language": "zh_CN",
  "city": "Guangzhou",
  "province": "Guangdong",
  "country": "CN",
  "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
}

使用者的session-key:

HyVFkGl5F5OQWJZZaNzBBg==

所以,用於簽署的字串為:

{"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==

使用sha1得到的結果為

75e81ceda165f4ffa64f4068af58c64b8f54b88c

加密資料解密演算法

介面如果涉及敏感數據(如wx.getUserInfo當中的openId 和unionId ),介面的明文內容將不包含這些敏感資料。開發者如需要取得敏感數據,需要對介面傳回的加密資料( encryptedData )進行對稱解密。解密演算法如下:

  1. 對稱解密所使用的演算法為 AES-128-CBC,資料採用PKCS#7填入。
  2. 對稱解密的目標密文為Base64_Decode(encryptedData),
  3. #對稱解密碼鑰aeskey = Base64_Decode(session_key), aeskey 是16位元組
  4. 對稱解密初始向量iv 會在資料介面中回傳。

微信官方提供了多種程式語言的範例程式碼(點擊下載)。每種語言類型的介面名字均一致。調用方式可以參考範例。

另外,為了應用能校驗資料的有效性,我們會在敏感資料加上資料水印( watermark )

watermark參數說明:

QQ截图20170208150911.png

如介面http://www.w3cschool.cn/weixinapp/weixinapp-open.html敏感資料當中的watermark:

{
    "openId": "OPENID",
    "nickName": "NICKNAME",
    "gender": GENDER,
    "city": "CITY",
    "province": "PROVINCE",
    "country": "COUNTRY",
    "avatarUrl": "AVATARURL",
    "unionId": "UNIONID",
    "watermark":
    {
        "appid":"APPID",
        "timestamp":TIMESTAMP
    }
}

註:先前提供的加密資料(encryptData)以及對應的加密演算法將被棄用,請開發者不要再依賴舊邏輯。