Maison  >  Article  >  Applet WeChat  >  Introduction au développement WeChat (6) Décryptage des données utilisateur

Introduction au développement WeChat (6) Décryptage des données utilisateur

零下一度
零下一度original
2017-05-24 09:38:082073parcourir

Je vois souvent des amis dans le groupe poser des questions sur le processus de décryptage des données des utilisateurs du mini-programme, j'ai donc l'intention d'écrire un tutoriel sur le décryptage des données sensibles des utilisateurs du mini-programme

Le processus de cryptage est terminé le ; le serveur WeChat et le processus de décryptage est en L'applet et son propre serveur sont terminés, c'est-à-dire que les données suivantes sont obtenues à partir de encryptData :

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

Connaissances préparatoires :

  1. Encodage et décodage Base64

  2. Algorithme AES, mode padding, vecteur de décalage

  3. session _cléclé de session et comment stocker et récupérer

Les 3 points ci-dessus sont très importants pour comprendre le processus de décryptage .

Selon les documents officiels, j'ai réglé le processus général de décryptage, comme suit :

Introduction au développement WeChat (6) Décryptage des données utilisateur

  1. Le client de l'applet appelle wx. login, Le rappel contient js_code.

  2. Envoyez ensuite js_code au serveur A (serveur développeur). Le serveur A lance une requête au serveur WeChat avec les paramètres js_code, appId, secretkey et grant_type en échange de l'openid et de la session_key de l'utilisateur ( clé de session).

  3. Une fois que le serveur A a obtenu la clé de session, il génère un nombre aléatoire que nous appelons 3rd_session, avec 3rdSessionId comme clé et session_key + openid comme valeurCache à redis ou memcached car l'équipe WeChat ne recommande pas de transmettre directement la session_key sur le réseau, le développeur doit générer une clé unique à associer à la session_key. Sa fonction est :

    1. Renvoie le 3rdSessionId au client et maintient l'état de connexion de l'applet.

    2. Trouvez l'utilisateur session_key et openid via 3rdSessionId.

  4. Une fois que le client a obtenu le 3rdSessionId, il est mis en cache dans le stockage

  5. Les données sensibles de l'utilisateur cryptées peuvent être obtenues via wx. getUserIinfo.

  6. Le client envoie les données chiffrées, le 3rdSessionId et le décalage ensemble au serveur A

  7. Le serveur A obtient la clé de session du cache en fonction du 3rdSessionId

  8. Utilisez AES pour décrypter les données chiffrées sur le serveur A afin de réaliser le décryptage des données sensibles de l'utilisateur

Concentrez-vous sur les trois liens 6, 7 et 8 .
Déchiffrement AES trois paramètres :

  • texte chiffré Données chiffrées

  • clé aesKey

  • Vecteur de décalage iv

Processus de décryptage côté serveur :

  1. Le texte chiffré et le vecteur de décalage sont envoyés par le client au serveur. Les deux paramètres effectuent un décodage en Base64. Opération de décodage côté serveur.

  2. Récupérez la clé de session à partir du cache en fonction du 3rdSessionId, et décodez en Base64 la clé de session pour obtenir aesKey, aes key.

  3. Appelez la méthode de décryptage aes, l'algorithme est AES-128-CBC et les données sont remplies avec PKCS#7.

Ce qui suit explique le processus de décryptage avec un exemple de mini-programme :

1 Connectez-vous avec WeChat et obtenez des informations sur l'utilisateur

var that = this;wx.login({success: function (res) {
    //微信js_code
    that.setData({wxcode: res.code});
    //获取用户信息
    wx.getUserInfo({
        success: function (res) {
            //获取用户敏感数据密文和偏移向量
            that.setData({encryptedData: res.encryptedData})            that.setData({iv: res.iv})        }
    })}})

2. . Utilisez le code pour échanger contre le 3rdSessionId

var httpclient = require('../../utils/httpclient.js')
VAR that = this//httpclient.req(url, data, method, success, fail)httpclient.req(  'http://localhost:8090/wxappservice/api/v1/wx/getSession',
  {
      apiName: 'WX_CODE',
      code: this.data.wxcode
  },
  'GET',
  function(result){
    var thirdSessionId = result.data.data.sessionId;
    that.setData({thirdSessionId: thirdSessionId})    //将thirdSessionId放入小程序缓存
    wx.setStorageSync('thirdSessionId', thirdSessionId)  },
  function(result){
    console.log(result)  });

3. Lancer la demande de décryptage

//httpclient.req(url, data, method, success, fail)httpclient.req('http://localhost:8090/wxappservice/api/v1/wx/decodeUserInfo',
  {
    apiName: 'WX_DECODE_USERINFO',
    encryptedData: this.data.encryptedData,
    iv: this.data.iv,
    sessionId: wx.getStorageSync('thirdSessionId')  },
  'GET',
  function(result){
  //解密后的数据
    console.log(result.data)  },
  function(result){
    console.log(result)  });

4. Implémentation du décryptage côté serveur (java)

/** * 解密用户敏感数据 * @param encryptedData 明文 * @param iv            加密算法的初始向量 * @param sessionId     会话ID * @return */@Api(name = ApiConstant.WX_DECODE_USERINFO)@RequestMapping(value = "/api/v1/wx/decodeUserInfo", method = RequestMethod.GET, produces = "application/json")public Map<String,Object> decodeUserInfo(@RequestParam(required = true,value = "encryptedData")String encryptedData,        @RequestParam(required = true,value = "iv")String iv,        @RequestParam(required = true,value = "sessionId")String sessionId){    //从缓存中获取session_key
    Object wxSessionObj = redisUtil.get(sessionId);    if(null == wxSessionObj){        return rtnParam(40008, null);
    }
    String wxSessionStr = (String)wxSessionObj;
    String sessionKey = wxSessionStr.split("#")[0];    try {
        AES aes = new AES();        byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv));        if(null != resultByte && resultByte.length > 0){
            String userInfo = new String(resultByte, "UTF-8");            return rtnParam(0, userInfo);
        }
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }    return rtnParam(50021, null);
}

5. . Code de base de décryptage AES

public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {    initialize();    try {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        Key sKeySpec = new SecretKeySpec(keyByte, "AES");

        cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化 
        byte[] result = cipher.doFinal(content);        return result;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();  
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();  
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (NoSuchProviderException e) {        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {        // TODO Auto-generated catch block
        e.printStackTrace();
    }

L'effet final est le suivant :
Introduction au développement WeChat (6) Décryptage des données utilisateur

Si votre mini-programme n'est pas lié à la plateforme ouverte WeChat, les données décryptées le sont. ne contient pas le paramètre unionid
Liaison du mini programme WeChat Open Platform Connection

Résumé

À partir des données décryptées, les seules données sensibles sont appid Je pense personnellement qu'openid n'est pas sensible ; données, et chaque utilisateur en générera une pour chaque compte officielSécurisé openid n'est disponible que dans le cadre de l'appid ; À moins que votre application soit également divulguée.

Ainsi, l'appid peut être obtenu à partir des données décryptées. Quel est le but de l'équipe du mini programme WeChat ? Comme je l'ai déjà dit, openid n'est rien sans appid. Ensemble, openid et appid sont utilisés pour permettre aux développeurs de mini-programmes de distinguer et d'isoler les utilisateurs entre les différentes applications de mini-programmes, et en même temps, ils peuvent combiner le système utilisateur WeChat avec le troisième. système commercial de parti.

Je pense donc que l'utilisation principale du décryptage des données sensibles n'est pas de les décrypter et de les renvoyer au client, mais d'intégrer les informations des utilisateurs de WeChat dans sa propre activité côté serveur.

[Recommandations associées]

1. Téléchargement du code source de la plateforme de compte public WeChat

2. Code source de vote WeChat

3. WeChat Lala Takeaway 2.2.4 Version Open Source décryptée du code source de WeChat Rubik's Cube

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn