CryptoJS是javascrpit強(qiáng)大的加密解密庫,要實現(xiàn)加解密,云側(cè)和端側(cè)的加密方式需要一一對應(yīng)珠叔。例如蝎宇,云側(cè)采用AES/CBC/PKCS5Padding加密,前端CryptoJS也要采用aes的CBC/PKCS5Padding方式加密祷安。
具體以下5項要和云側(cè)保持一致:
- Key
- IV姥芥,偏移量
- Mode,加密模式汇鞭,有CBC凉唐、ECB等
- Padding,補(bǔ)齊模式霍骄,Pkcs7等台囱。加密串按照一定的大小進(jìn)行分組,最后分剩下那一組读整,不夠長度玄坦,就需要進(jìn)行補(bǔ)齊,這個屬性代表了以何種方式補(bǔ)齊
- 加密串編碼格式绘沉,通過CryptoJS.AES.encrypt方法加密完成后煎楣,要和云側(cè)約定以何種方式對加密串編碼后傳給云側(cè),例如车伞,不編碼直接傳择懂,base64,hex等等另玖,我們項目采用base64, 所以最終調(diào)用CryptoJS.enc.Base64.stringify(encrypted.ciphertext)導(dǎo)出困曙。
以下為加密函數(shù)的調(diào)用實現(xiàn):
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,補(bǔ)碼方式為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谦去,補(bǔ)碼方式為PKCS5Padding(也就是PKCS7)
encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
}
//編碼導(dǎo)出
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>