一、RSA
加密流程:获取到后台传来的公钥,调用小程序登录接口获取到tokenId和userId,通过公钥使用RSA加密参数,再次请求时传给后台
1、创建RSA加密JS文件wx_rsa.js(下载wx_rsa.js),放到utils文件夹下面。
2、引入js文件,创建加密方法RSAEncrypt()
function RSAEncrypt(publicKey, params) { var RSA = require('./wxapp_rsa') var publicKey_pkcs1 = `-----BEGIN PUBLIC KEY-----${publicKey}-----END PUBLIC KEY-----`; // 加密 【加密字段长度不大于117】 var encrypt_rsa = new RSA.RSAKey(); encrypt_rsa = RSA.KEYUTIL.getKey(publicKey_pkcs1); var encStr = encrypt_rsa.encrypt(params) encStr = RSA.hex2b64(encStr); return encStr; } export { RSAEncrypt }3、调用该方法加密参数
二、AES
1、创建加解密器Cryptor和方法
//引入CryptoJS库文件 ['CryptoMath', 'BlockModes', 'AES', 'MD5', 'HMAC', 'SHA1'].forEach((path) => { require('./lib/' + path); }); //加密工具对象 var Crypto = require('./lib/Crypto').Crypto; const MODE = new Crypto.mode.CBC(Crypto.pad.pkcs7); /** * 加解密器 */ export default class Cryptor{ constructor(props) { //apiCode+head拼接字符串md5加密 const strMd5 = Crypto.MD5(props.apiCode + props.head); const arrMd5 = Crypto.charenc.UTF8.stringToBytes(strMd5); //前16位作为iv this.tempIv = arrMd5.slice(0, 16); //后16位作为key this.tempKey = arrMd5.slice(16); } /** * 加密 * @param {String} cleartext */ encrypt(cleartext) { if (!cleartext || cleartext == '{}') { return ''; } return Crypto.AES.encrypt(cleartext, this.tempKey, { iv: this.tempIv, mode: MODE }); } /** * 解密 * @param {String} ciphertext 密文 */ decrypt(ciphertext) { return Crypto.AES.decrypt(ciphertext, this.tempKey, { iv: this.tempIv, mode: MODE }); } }2、加密
/** * 装载请求数据体 * @param {Object} params 请求参数对象 * @param {String} apiCode 接口名 * @return {Object} data 请求体数据 * @return {Object} cryptor 加密器 */ const assembleRequestData = function (params = {}, apiCode = '') { let head = JSON.stringify({ 'AppCode': config.AppCodeEncrypted, 'WaterMark': new Date().getTime() }); let data = { head: head }; let body = JSON.stringify(params); //创建加密器对象 const cryptor = new CryptorClass({ head, apiCode }); data.body = cryptor.encrypt(body); return { data, cryptor }; };3、解密
cryptor是加密时创建的加密器
respData = JSON.parse(cryptor.decrypt(response.data));