RSA+AES前后端通讯加解密-前端部分
- 流程:
- 前端随机生成AES秘钥,使用RSA公钥对AES秘钥进行加密得到密钥
- 前端使用AES秘钥对数据进行加密得到密文
- 将这两者包装在一个对象里面传给后台
- 后台使用RSA私钥解密密钥得到AES秘钥,使用AES秘钥对密文进行解密得到数据
- 后台使用AES秘钥对数据进行加密返回给前端,前端使用AES秘钥解密
- 注意点:
- 前后端的加解密流程要一致,要对照每一步进行操作
- AES加密是对字符串进行加密,不能对对象进行加密,因此想要加密对象就要先转换成JSON字符(尝试过将对象直接加密,解密后得到的是一个空对象
- RSA公私钥可以用工具随机生成,每一对公私钥都是对应的且唯一对应的
- AES和RSA加密的方式都是可选的,要与后台确认好加解密采用的是同一种方法
- 加解密函数与随机生成AES秘钥的代码:
import CryptoJS from "crypto-js";
import JSEncrypt from 'jsencrypt'
export const encryptAES=(aesPassword, word)=>{
const key = CryptoJS.enc.Utf8.parse(aesPassword);
const srcs = CryptoJS.enc.Utf8.parse(word);
const encrypted = CryptoJS.AES.encrypt(srcs, key, { mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
}
export const decryptAES=(aesPassword, word)=>{
const key = CryptoJS.enc.Utf8.parse(aesPassword);
const decrypt = CryptoJS.AES.decrypt(word, key, { mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
export const initKey=(len)=>{
len = len || 32;
let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz23456789~!@#$%^&*()_+}{":?><';
let maxPos = $chars.length;
let pwd = '';
let i=0;
for (i = 0; i < len; i++) {
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
}
export const encryptRSA=(PUBLIC_KEY,word)=>{
const encrypt = new JSEncrypt();
encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
return encrypt.encrypt(word);
}
export const decryptRSA=(PRIVATE_KEY,word)=>{
const decrypt = new JSEncrypt();
decrypt.setPrivateKey('-----BEGIN RSA PRIVATE KEY-----'+PRIVATE_KEY+'-----END RSA PRIVATE KEY-----');
return decrypt.decrypt(word);
}