js加密解密
前端=加密+解密
加密req, 解密resp
// AES + RAS 库
const CryptoJS = require("crypto-js");
const JSEncrypt = require('jsencrypt').default;
// 前端
// 生成密钥(16字节,即128位)
const secretKey = CryptoJS.lib.WordArray.random(128 / 8).toString();
console.log(secretKey); // AES随机密钥
// 明文数据字串
const aesData = JSON.stringify({username: 'zhangsan',pwd: 'hahahaa'});
// 1.AES加密
const ciphertext = CryptoJS.AES.encrypt(aesData, secretKey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString();
// 2.RSA加密
// 公钥 (RSA密钥-网络工具生成的,这里省略了密钥里的注释-一行化)
const publicKey = `MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOwmx7Qpph33u8yx/JQ1xSGUsVVa+pUnMBJv38qYyYEGWOr3A1+tIXGeXSrtRG3hrQCO8D0JMBLRBpwI2h01hKsCAwEAAQ==`;
// 加密
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
const encrypted = encrypt.encrypt(secretKey); // 加密(AES密钥)
// 3.加签
let time = Date.now() // 验签时间戳,增加随机性
// ajax真实发送数据格式
let responseData = {
encrypted, // 加密后的aes密钥
ciphertext, // aes加密的业务数据
time
}
responseData.sign = CryptoJS.SHA256(JSON.stringify(responseData)).toString();
console.log(responseData)
// 前端AES解密ajax返回值, 使用AES密钥(可每次刷新后用一个保留在内存),同后端AES解密,省略。
后端=解密+加密
// 1.验签
let sign = responseData.sign
delete responseData.sign
let sign1 = CryptoJS.SHA256(JSON.stringify(responseData)).toString();
console.log("sign:" + (sign == sign1)); // sign1 == sign 即验签通过,防止消息被篡改
// 2.RSA解密
// 私钥 - 后端保密存储, 这一对来源网络搜索
const privateKey = `MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEA7CbHtCmmHfe7zLH8lDXFIZSxVVr6lScwEm/fypjJgQZY6vcDX60hcZ5dKu1EbeGtAI7wPQkwEtEGnAjaHTWEqwIDAQABAkEAjgopVlEyzJWkjNOFo7PP1Yn1O+zUCgCfJofJ6LcLhKGf7b9EM9KiWtTQpZavGKkS29kHoBetvLvHcD+0wFKZgQIhAPkJPsJmCOT4i1Ie6R+AQY9JTFuPuF2vqhVCWSgt4BbrAiEA8sFMfLqaJj1lmjs2/zT4l2njKbpDcChrqH2CEogIWUECIGYILqlxKqW9Wz+LIJJidvng2yMMcEoaJcJOC79VhGF/AiA+MgY9wrVx7LMWY+uAUXsLmCaKb12N491JavajdtTkwQIhALzNQBydA53i69VkfIvfNd6AHO/xBhWJJ6ukpdwFaPjN`;
// 解密
const decrypt = new JSEncrypt();
decrypt.setPrivateKey(privateKey);
const decrypted = decrypt.decrypt(encrypted); // 获取AES密钥 decrypted == secretKey
// 3.AES解密
console.log(decrypted);
const plaintext = CryptoJS.AES.decrypt(ciphertext, decrypted, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
console.log('plaintext: ', plaintext);
// plaintext: {"username":"zhangsan","pwd":"hahahaa"}