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 } }
_
SchlüsselDie oben genannten 3 Punkte sind sehr wichtig für das Verständnis des Entschlüsselungsprozesses .
Der Applet-Client ruft wx auf. login, Der Rückruf enthält
js_code.
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).
bis
redis; 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.
Vorgang auf der Serverseite.
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.
1 Melden Sie sich mit WeChat an und erhalten Sie Benutzerinformationen
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}) } })}})
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) });
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) });
/** * 解密用户敏感数据 * @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); }
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(); }
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 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.
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-QuellcodesDas 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!