目录

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

目录

前端加密,后端解密(用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加解密详情请点击这里:

前后端用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
),
};