前端加密,后端解密(用RSA和AES256双重加密)

这两天接到这么一个需求:
1、生成一个密钥对
2、前端写死RSA2048公钥
3、后端RSA2048私钥写到配置文件中
4、前端发请求的时候random一个AES256的key,然后用RSA2048公钥加密Key生成key_str
5、前端发的请求体用AES256key整个加密生成sec_text
6、前端发请求的时候将key_str放入请求头(或者请求体也可以)
7、服务器端收到key_str用RSA2048私钥解密key_str得到AES256密钥,然后用AES256密钥解密sec_text获得请求数据

具体实现:
前后端用RSA加解密详情请点击这里:前后端RSA加解密

前后端用AES加解密详情请点击这里:前后端AES加解密

random函数生成一个n位随机数:

// n位随机数生成
function randomNum(n) {
  let sString = "";
  let strings =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  for (let i = 0; i < n; i++) {
    let ind = Math.floor(Math.random() * strings.length);
    sString += strings.charAt(ind);
  }
  return sString;
}
// 生成一个16位随机数作为AES加密的key值
var word = randomNum(16).toString();
/* JSEncrypt 公钥加密  padding:pkcs1pad2 */
export const getRsaKey = () => {
  // 公钥
  let pubKey = `XXXX`; // ES6 模板字符串 引用 rsa 公钥
  //创建jsencrypt加密对象
  let encryptStr = new JSEncrypt();
  encryptStr.setPublicKey(pubKey); // 设置 加密公钥
  let key_str = encryptStr.encrypt(word); // 进行加密
  return key_str;
};

/* JSEncrypt 私钥解密 */
export function decrypt() {
  let decrypt = new JSEncrypt();
  // 私钥
  const privateKeyStr = `XXXX`;
  // 设置私钥
  decrypt.setPrivateKey(privateKeyStr);
  // 解密
  var decryptMsg = decrypt.decrypt(getRsaKey());
  return decryptMsg;
}
/**
 * AES加密
 */
export const AESEncrypt = (str, key) => {
  let _key = key || word;
  const __key = CryptoJS.enc.Utf8.parse(_key); //将秘钥转换成Utf8字节数组
  // const iv = CryptoJS.enc.Utf8.parse(_key.substr(0, 16))
  //加密
  const encrypt = CryptoJS.AES.encrypt(JSON.stringify(str), __key, {
    // iv: iv,
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  });
  return encrypt.toString();
};

/**
 * AES解密密
 */
export const AESDecrypt = (str, key) => {
  let _key = key || word;
  const __key = CryptoJS.enc.Utf8.parse(_key); //将秘钥转换成Utf8字节数组

  const decrypt = CryptoJS.AES.decrypt(str, __key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  });
  const _decrypt = JSON.parse(decrypt.toString(CryptoJS.enc.Utf8)); //解密后的数据
  return _decrypt;
};

传给后端接口请求体里的参数参照如下:

import { AESEncrypt, getRsaKey } from "@/utils/AES.js";
let rqdata = {
        key_str: getRsaKey(),
        sec_text: AESEncrypt(
          JSON.stringify({
            name: data.applicant,
            areaCode: String(data.areaCode),
            phone: String(data.phoneNumber),
          }),
          null
        ),
      };

你可能感兴趣的:(前端,后端,java,vue)