Einführung in die WeChat-Entwicklung (6) Benutzerdatenentschlüsselung

零下一度
Freigeben: 2017-05-24 09:38:08
Original
2134 Leute haben es durchsucht

Ich sehe oft, dass einige Freunde in der Gruppe nach dem Entschlüsselungsprozess von Miniprogramm-Benutzerdaten fragen, daher habe ich vor, ein Tutorial zum Entschlüsseln sensibler Daten von Miniprogramm-Benutzern zu schreiben.

Der Verschlüsselungsprozess ist am abgeschlossen Der WeChat-Server und der Entschlüsselungsprozess sind abgeschlossen. Das Applet und sein eigener Server sind abgeschlossen, d >

Base64-Kodierung und -Dekodierung
{
    "openId": "OPENID",
    "nickName": "NICKNAME",
    "gender": GENDER,
    "city": "CITY",
    "province": "PROVINCE",
    "country": "COUNTRY",
    "avatarUrl": "AVATARURL",
    "unionId": "UNIONID",
    "watermark":
    {
        "appid":"APPID",
        "timestamp":TIMESTAMP
    }
}
Nach dem Login kopieren

    AES-Algorithmus, Füllmodus, Offset-Vektor
  1. Sitzung

    _

    Schlüssel
  2. Sitzungsschlüssel und Speichern und Abrufen
  3. Die oben genannten 3 Punkte sind sehr wichtig für das Verständnis des Entschlüsselungsprozesses .

  4. Den offiziellen Dokumenten zufolge habe ich den allgemeinen Entschlüsselungsprozess wie folgt geregelt:

Der Applet-Client ruft wx auf. login, Der Rückruf enthält

jsEinführung in die WeChat-Entwicklung (6) Benutzerdatenentschlüsselung_code.

  1. Senden Sie dann js_code an Server A (Entwicklerserver Server A initiiert eine Anfrage an den WeChat-Server mit den Parametern js_code, appId, Secretkey und grant_type im Austausch für die openid und session_key (). Sitzungsschlüssel).

  2. Nachdem Server A den session_key erhalten hat, generiert er eine Zufallszahl, die wir 3rd_session nennen, mit 3rdSessionId als Schlüssel und session_key + openid als Wert
  3. Cache

    bis

    redis
  4. oder
  5. memcached

    ; Da das WeChat-Team nicht empfiehlt, den session_key direkt im Netzwerk zu übertragen, muss der Entwickler einen eindeutigen Schlüssel generieren, der dem session_key zugeordnet werden kann. Seine Funktion ist: Geben Sie die 3rdSessionId an den Client zurück und behalten Sie den Anmeldestatus des Miniprogramms bei.

    1. Finden Sie den Sitzungsschlüssel und die OpenID des Benutzers über 3rdSessionId.
    2. Nachdem der Client die 3rdSessionId erhalten hat, wird sie im Speicher zwischengespeichert

    Benutzersensible Daten können über wx abgerufen werden. getUserIinfo.
  6. Der Client sendet die verschlüsselten Daten, die 3rdSessionId und den Offset zusammen an Server A
  7. Server A erhält den Sitzungsschlüssel aus dem Cache basierend auf der 3rdSessionId
  8. Verwenden Sie AES, um die verschlüsselten Daten auf Server A zu entschlüsseln, um die Entschlüsselung sensibler Benutzerdaten zu erreichen
  9. Konzentrieren Sie sich auf die drei Links 6, 7 und 8 .
  10. AES-Entschlüsselung drei Parameter:

Chiffretext verschlüsseltDaten


    Schlüssel aesKey
  • Offset-Vektor iv
  • Serverseitiger Entschlüsselungsprozess:
  • Der Chiffretext und der Offset-Vektor werden vom Client an den Server gesendet. Die beiden Parameter führen Base64_decode durch
Dekodierung

Vorgang auf der Serverseite.

  1. Rufen Sie den Sitzungsschlüssel aus dem Cache basierend auf der 3rdSessionId ab und dekodieren Sie den Sitzungsschlüssel mit Base64, um aesKey und den aes-Schlüssel zu erhalten.

  2. Rufen Sie die AES-Entschlüsselungsmethode auf, der Algorithmus ist AES-128-CBC und die Daten werden mit PKCS#7 gefüllt.
  3. Im Folgenden wird der Entschlüsselungsprozess anhand eines Miniprogrammbeispiels erläutert:
  4. 1 Melden Sie sich mit WeChat an und erhalten Sie Benutzerinformationen

2 . Code zum Austauschen für 3rdSessionId verwenden

3. Entschlüsselungsanforderung einleiten

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})        }
    })}})
Nach dem Login kopieren

4 . AES-Entschlüsselungskerncode

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)  });
Nach dem Login kopieren

Der Endeffekt ist wie folgt:

//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)  });
Nach dem Login kopieren

Wenn Ihr Miniprogramm nicht an die offene WeChat-Plattform gebunden ist, sind dies die entschlüsselten Daten nicht den Unionid-Parameter enthalten
/** * 解密用户敏感数据 * @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);
}
Nach dem Login kopieren
Bindung des Miniprogramms WeChat Open Platform Connection

Zusammenfassung
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();
    }
Nach dem Login kopieren

Von den entschlüsselten Daten sind die einzigen sensiblen Daten appid; ich persönlich bin der Meinung, dass openid nicht sensibel ist Daten, und jeder Benutzer generiert eine für jedes offizielle Konto
Sicher Einführung in die WeChat-Entwicklung (6) Benutzerdatenentschlüsselung openid ist nur im Umfang von appid verfügbar. Es sei denn, Ihre App-ID ist ebenfalls durchgesickert.

Damit die App-ID aus den entschlüsselten Daten abgerufen werden kann. Was ist der Zweck des WeChat Mini-Programmteams? Wie ich bereits sagte, ist openid nichts ohne appid. Zusammen werden openid und appid verwendet, um Miniprogrammentwicklern die Unterscheidung und Isolierung von Benutzern zwischen verschiedenen Miniprogrammanwendungen zu erleichtern und gleichzeitig das WeChat-Benutzersystem mit dem dritten zu kombinieren -Parteien-Geschäftssystem.

Ich denke also, dass der Hauptzweck der Entschlüsselung sensibler Daten nicht darin besteht, sie zu entschlüsseln und an den Client zurückzusenden, sondern darin, WeChat-Benutzerinformationen serverseitig in ihr eigenes Geschäft zu integrieren.

[Verwandte Empfehlungen]

1. Quellcode der WeChat-Plattform herunterladen

2 🎜>

3.

WeChat Lala Takeaway 2.2.4 entschlüsselt die Open-Source-Version des WeChat Rubik's Cube-Quellcodes

Das obige ist der detaillierte Inhalt vonEinführung in die WeChat-Entwicklung (6) Benutzerdatenentschlüsselung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage