Vérification de la signature, cryptage et déchiffrement des données utilisateur de l'API de l'applet WeChat


Vérification de la signature, cryptage et déchiffrement des données utilisateur


Vérification de la signature des données

Afin de garantir la sécurité des données utilisateur renvoyées par l'interface ouverte, WeChat signera les données en texte brut. Les développeurs peuvent effectuer une vérification de signature sur les paquets de données en fonction des besoins de l'entreprise afin de garantir l'intégrité des données.

  1. L'algorithme de vérification de signature implique la clé de session de l'utilisateur. La clé de session de l'utilisateur est obtenue via le processus de connexion wx.login et la relation correspondante avec le propre statut de connexion de l'application est maintenue.
  2. Lors de l'obtention de données en appelant une interface (telle que wx.getUserInfo), l'interface renverra rawData et signature en même temps, où signature = sha1( rawData + session_key )
  3. Le développeur enverra la signature et rawData au développeur serveur pour vérification. Le serveur utilise la clé de session correspondante de l'utilisateur pour calculer la signature signature2 en utilisant le même algorithme, et compare signature et signature2 pour vérifier l'intégrité des données.

Par exemple, vérification des données de wx.getUserInfo :

rawData renvoyée par l'interface :

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

Clé de session de l'utilisateur :

HyVFkGl5F5OQWJZZaNzBBg==

Donc, la chaîne utilisée pour la signature est :

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

obtenue à l'aide de sha1. le résultat est

75e81ceda165f4ffa64f4068af58c64b8f54b88c

algorithme de décryptage des données cryptées

Si l'interface implique des données sensibles (telles que openId et unionId dans wx.getUserInfo), le contenu en texte brut de l'interface ne contiendra pas ces données sensibles. Si les développeurs ont besoin d'obtenir des données sensibles, ils doivent déchiffrer symétriquement les encryptedData (encryptedData) renvoyées par l'interface. L'algorithme de décryptage est le suivant :

  1. L'algorithme utilisé pour le décryptage symétrique est AES-128-CBC et les données sont remplies avec PKCS#7.
  2. Le texte chiffré cible du déchiffrement symétrique est Base64_Decode(encryptedData),
  3. Clé de décryptage symétrique aeskey = Base64_Decode(session_key), aeskey est de 16 octets
  4. Le vecteur initial iv de l'algorithme de décryptage symétrique sera renvoyé dans l'interface de données.

WeChat fournit officiellement des exemples de codes dans plusieurs langages de programmation (cliquez pour télécharger). Les noms d'interface sont cohérents pour chaque type de langue. La méthode appelante peut faire référence à l'exemple.

De plus, afin que l'application vérifie la validité des données, nous ajouterons un filigrane de données (filigrane) aux données sensibles

description du paramètre watermark :

QQ截图20170208150911.png

comme l'interface http : //www.w3cschool.cn /weixinapp/weixinapp-open.html Filigrane dans les données sensibles :

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

Remarque : Les données cryptées (encryptData) fournies précédemment et l'algorithme de cryptage correspondant seront obsolètes. Les développeurs sont priés de ne pas s'y fier. sur la vieille logique.