WeChat アプレット API ユーザー データの署名検証と暗号化および復号化


ユーザーデータの署名検証と暗号化と復号化


データ署名検証

オープンインターフェイスから返されるユーザーデータの安全性を確保するために、WeChatは平文データに署名します。開発者は、ビジネス ニーズに基づいてデータ パケットの署名検証を実行し、データの整合性を確保できます。

  1. 署名検証アルゴリズムにはユーザーの session_key が含まれます。ユーザーの session_key は、wx.login ログイン プロセスを通じて取得され、アプリケーション自体のログイン ステータスとの対応関係が維持されます。
  2. インターフェイス (wx.getUserInfo など) を呼び出してデータを取得すると、インターフェイスは rawData と署名を同時に返します。ここで、signature = sha1( rawData + session_key ) です
  3. 開発者は署名と 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) を対称的に復号化する必要があります。復号アルゴリズムは次のとおりです:

  1. 対称復号に使用されるアルゴリズムは AES-128-CBC で、データは PKCS#7 で埋められます。
  2. 対称復号のターゲット暗号文はBase64_Decode(encryptedData)、
  3. 対称復号キーaeskey = Base64_Decode(session_key)、aeskeyは16バイトです
  4. 対称復号アルゴリズムの初期ベクトルivはデータインターフェースで返されます。

WeChat は、複数のプログラミング言語のサンプル コードを公式に提供しています (クリックしてダウンロード)。インターフェース名は言語タイプごとに一貫しています。呼び出しメソッドは例を参照できます。

さらに、アプリケーションがデータの有効性を検証するために、機密データにデータ ウォーターマーク (ウォーターマーク) を追加します

ウォーターマーク パラメーターの説明:

QQ截图20170208150911.png

インターフェイス 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) と対応する暗号化アルゴリズムは非推奨となります。開発者は依存しないでください。古いロジックで。