AES加密

411 阅读1分钟

背景

公司要求返回的图片地址进行加密,后端同事建议采用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}$/