小程序AES、RSA加密

小程序AES、RSA加密

1.RSA

加密流程:获取到后台传来的公钥,调用小程序登录接口获取到tokenId和userId,通过公钥使用RSA加密参数,再次请求时传给后台

  1. 创建RSA加密JS文件wx_rsa.js,放到utils文件夹下面
    可在网上下载js文件,参考https://github.com/zhangzhaopds/WeixinApp_RSA_Signature/blob/master/utils/wxapp_rsa.js
  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
}

  1. 调用该方法加密参数
2.AES

1.创建加解密器Cryptor和方法

//引入CryptoJS库文件 
['CryptoMath', 'BlockModes', 'AES', 'MD5', 'HMAC', 'SHA1'].forEach(function (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));
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值