wxbizdatacrypt java_使用CryptoJS解决微信小程序用户信息解密

本文介绍了如何使用CryptoJS库在纯JavaScript环境下解密微信小程序通过wx.getUserInfo接口返回的加密用户信息。通过引入CryptoJS,创建RdWXBizDataCrypt.js文件并封装解密函数,实现AES-128-CBC的对称解密,确保数据有效性和安全性。
摘要由CSDN通过智能技术生成

使用CryptoJS解决微信小程序用户信息解密

问题描述:

wx.getUserInfo(OBJECT)微信官方的这个获取用户信息的方法,需要对接口返回的加密数据( encryptedData )进行对称解密。

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:

对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。

对称解密的目标密文为 Base64_Decode(encryptedData)。

对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。

对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。

另外,为了应用能校验数据的有效性,我们会在敏感数据加上数据水印( watermark )

注:此前提供的加密数据(encryptData)以及对应的加密算法将被弃用,请开发者不要再依赖旧逻辑。

下载后发现,这里边居然没有纯 js 的 demo,好歹你自己家的小程序是只能用 js 哇。

14940418201469.jpg

找了网上好多文章,基本都是 Java 版本的解密,所以决定自己弄个纯js的。

干货:模仿 Node 的 demo,使用 CryptoJS实现纯 js 下解密用户信息

将 CryptoJS 的包放入 小程序的 utils 中(点击下载)

14940435128684.jpg

2. 封装 RdWXBizDataCrypt.js

/**

* Created by rd on 2017/5/4.*/

//引入CryptoJS

var Crypto = require(‘cryptojs/cryptojs.js‘).Crypto;var app =getApp();functionRdWXBizDataCrypt(appId, sessionKey) {this.appId =appIdthis.sessionKey =sessionKey

}

RdWXBizDataCrypt.prototype.decryptData= function(encryptedData, iv) {//base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码

var encryptedData =Crypto.util.base64ToBytes(encryptedData)var key = Crypto.util.base64ToBytes(this.sessionKey);var iv =Crypto.util.base64ToBytes(iv);//对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充

var mode = newCrypto.mode.CBC(Crypto.pad.pkcs7);try{//解密

var bytes =Crypto.AES.decrypt(encryptedData, key, {

asBpytes:true,

iv: iv,

mode: mode

});var decryptResult =JSON.parse(bytes);

}catch(err) {

console.log(err)

}if (decryptResult.watermark.appid !== this.appId) {

console.log(err)

}returndecryptResult

}

module.exports= RdWXBizDataCrypt

3. 在 app.js 中引入 RdWXBizDataCrypt

var WXBizDataCrypt = require(‘utils/RdWXBizDataCrypt.js‘);var AppId = ‘wx**************‘

var AppSecret = ‘8f***************************‘App({

onLaunch:function() {

},

getUserInfo:function(cb){var that = this

if(this.globalData.userInfo){typeof cb == "function" && cb(this.globalData.userInfo)

}else{//调用登录接口,获取 code

wx.login({

success:function(res) {//发起网络请求

wx.request({

url:‘https://api.weixin.qq.com/sns/jscode2session‘,

data:{

appid:AppId,

secret:AppSecret,

js_code:res.code,

grant_type:‘authorization_code‘},

header: {"Content-Type": "application/x-www-form-urlencoded"},

method:‘GET‘,

success:function(res){var pc = newWXBizDataCrypt(AppId, res.data.session_key)

wx.getUserInfo({

success:function(res) {var data =pc.decryptData(res.encryptedData , res.iv)

console.log(‘解密后 data: ‘, data)

}

})

},

fail:function(res) {},

complete:function(res) {}

});

}

})

}

}

})

4. 实现效果

14940529292689.jpg

login.png

原文:http://www.cnblogs.com/cai-rd/p/6816849.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值