首页 > 建站教程 > JS、jQ、TS >  小程序AES、RSA加密正文

小程序AES、RSA加密

我爱模板网在做一个微信小程序的项目时,需要用到AES、RAS进行加密。

一、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));