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"}