CryptoJS是javascrpit强大的加密解密库,要实现加解密,云侧和端侧的加密方式需要一一对应。例如,云侧采用AES/CBC/PKCS5Padding加密,前端CryptoJS也要采用aes的CBC/PKCS5Padding方式加密。
具体以下5项要和云侧保持一致:
- Key
- IV,偏移量
- Mode,加密模式,有CBC、ECB等
- Padding,补齐模式,Pkcs7等。加密串按照一定的大小进行分组,最后分剩下那一组,不够长度,就需要进行补齐,这个属性代表了以何种方式补齐
- 加密串编码格式,通过CryptoJS.AES.encrypt方法加密完成后,要和云侧约定以何种方式对加密串编码后传给云侧,例如,不编码直接传,base64,hex等等,我们项目采用base64, 所以最终调用CryptoJS.enc.Base64.stringify(encrypted.ciphertext)导出。
以下为加密函数的调用实现:
import CryptoJS from "crypto-js";
const key = CryptoJS.enc.Utf8.parse("$$ysdfsdfsdfbj");
const iv = CryptoJS.enc.Utf8.parse("dYsdfgssdfgsddfgo");
export default {
//aes加密
aesEncrypt(word) {
let encrypted = "";
if (typeof word == "string") {
const srcs = CryptoJS.enc.Utf8.parse(word);
//模式为CBC,补码方式为PKCS5Padding(也就是PKCS7)
encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
} else if (typeof word == "object") {
const data = JSON.stringify(word);
const srcs = CryptoJS.enc.Utf8.parse(data);
//模式为CBC,补码方式为PKCS5Padding(也就是PKCS7)
encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
}
//编码导出
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
},
// aes解密
aesDecrypt(word) {
const encryptedHexStr = CryptoJS.enc.Hex.parse(word);
const srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
const decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
};
参考:
AES/CBC/PKCS5Padding 到底是什么
https://xie.infoq.cn/article/7e93850ddb9a6170bd49cd28c</wiz-editor-doc>