微信小程式API 使用者資料的簽章驗證與加解密
使用者資料的簽章驗證與加解密
資料簽章校驗
為了確保 開放介面 傳回使用者資料的安全性,微信會對明文資料進行簽章。開發者可以根據業務需求對資料包進行簽章校驗,確保資料的完整性。
- 簽署校驗演算法涉及使用者的session_key,透過 wx.login 登入流程取得使用者session_key,並自行維護與應用自身登入態的對應關係。
- 透過呼叫介面(如wx.getUserInfo)取得資料時,介面會同時傳回rawData、signature,其中signature = sha1( rawData + session_key )
- #開發者將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 )進行對稱解密。解密演算法如下:
- 對稱解密所使用的演算法為 AES-128-CBC,資料採用PKCS#7填入。
- 對稱解密的目標密文為Base64_Decode(encryptedData),
- #對稱解密碼鑰aeskey = Base64_Decode(session_key), aeskey 是16位元組
- 對稱解密初始向量iv 會在資料介面中回傳。
微信官方提供了多種程式語言的範例程式碼(點擊下載)。每種語言類型的介面名字均一致。調用方式可以參考範例。
另外,為了應用能校驗資料的有效性,我們會在敏感資料加上資料水印( watermark )
watermark參數說明:
如介面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)以及對應的加密演算法將被棄用,請開發者不要再依賴舊邏輯。