WeChat アプレット API ユーザー データの署名検証と暗号化および復号化
ユーザーデータの署名検証と暗号化と復号化
データ署名検証
オープンインターフェイスから返されるユーザーデータの安全性を確保するために、WeChatは平文データに署名します。開発者は、ビジネス ニーズに基づいてデータ パケットの署名検証を実行し、データの整合性を確保できます。
- 署名検証アルゴリズムにはユーザーの session_key が含まれます。ユーザーの session_key は、wx.login ログイン プロセスを通じて取得され、アプリケーション自体のログイン ステータスとの対応関係が維持されます。
- インターフェイス (wx.getUserInfo など) を呼び出してデータを取得すると、インターフェイスは rawData と署名を同時に返します。ここで、signature = sha1( rawData + session_key ) です
- 開発者は署名と 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" }
ユーザーのセッションキー:
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 (encryptedData) を対称的に復号化する必要があります。復号アルゴリズムは次のとおりです:
- 対称復号に使用されるアルゴリズムは AES-128-CBC で、データは PKCS#7 で埋められます。
- 対称復号のターゲット暗号文はBase64_Decode(encryptedData)、
- 対称復号キーaeskey = Base64_Decode(session_key)、aeskeyは16バイトです
- 対称復号アルゴリズムの初期ベクトルivはデータインターフェースで返されます。
WeChat は、複数のプログラミング言語のサンプル コードを公式に提供しています (クリックしてダウンロード)。インターフェース名は言語タイプごとに一貫しています。呼び出しメソッドは例を参照できます。
さらに、アプリケーションがデータの有効性を検証するために、機密データにデータ ウォーターマーク (ウォーターマーク) を追加します
ウォーターマーク パラメーターの説明:
インターフェイス http: //www.w3cschool.cn /weixinapp/weixinapp-open.html 機密データのウォーターマーク:
{ "openId": "OPENID", "nickName": "NICKNAME", "gender": GENDER, "city": "CITY", "province": "PROVINCE", "country": "COUNTRY", "avatarUrl": "AVATARURL", "unionId": "UNIONID", "watermark": { "appid":"APPID", "timestamp":TIMESTAMP } }
注: 以前に提供されていた暗号化データ (encryptData) と対応する暗号化アルゴリズムは非推奨となります。開発者は依存しないでください。古いロジックで。