背景
公司要求返回的图片地址进行加密,后端同事建议采用AES加密。前端有一个库实现了AES加密的算法,故记录下。
cdn引用
<!-- 引入 CDN Crypto.js 开始 AES加密 注意引入顺序 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/enc-base64.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/md5.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/evpkdf.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/cipher-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/aes.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/pad-pkcs7.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/mode-ecb.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/enc-utf8.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/enc-hex.min.js"></script>
<!-- 引入 CDN Crypto.js 结束 -->
前端代码实现
<script>
// const key = CryptoJS.enc.Utf8.parse("·······"); // 十六位十六进制数作为密钥
// const iv = CryptoJS.enc.Utf8.parse("·······"); // 十六位十六进制数作为密钥偏移量
// 解密方法
function Decrypt(content) {
var sKey = CryptoJS.enc.Utf8.parse("密钥字符串");
var decrypt = CryptoJS.AES.decrypt(content, sKey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
// let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
// let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
// let decrypt = CryptoJS.AES.decrypt(srcs, key, {
// iv: iv,
// mode: CryptoJS.mode.CBC,
// padding: CryptoJS.pad.Pkcs7
// });
// let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
// return decryptedStr.toString();
}
// 加密方法
function Encrypt(content) {
var sKey = CryptoJS.enc.Utf8.parse("密钥字符串");
var sContent = CryptoJS.enc.Utf8.parse(content);
var encrypted = CryptoJS.AES.encrypt(sContent, sKey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
// var srcs = CryptoJS.enc.Utf8.parse(JSON.stringify(word));
// var encrypted = CryptoJS.AES.encrypt(srcs, key, {
// mode: CryptoJS.mode.ECB,
// padding: CryptoJS.pad.Pkcs7
// });
// return encrypted.toString();
}
window.onload = function(){
// 尝试解密
const url = Decrypt('tC40I8BqXmMD3T90XgiEsNy2PtpURX92LtfH65D6PvS900PvLOMaIM22prlKgr1BauuKTzyU6l3vN2eIaKQm1+BBU0jwvge3NJRNGVqmPDo=');
window.alert(url);
}
</script>
密码长度为8~20位,必须包含字母大小写、数字及特殊符号
/^(?=.\*[a-z])(?=.\*[A-Z])(?=.\*\d)(?=.\*[\. @$!%\*#_~?&\^])[A-Za-z\d\. @$!%\*#_~?&\^]{8,20}$/