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