java 前后端加AES+BASE64解密说明

用 AES+BASE64 加、解密;

注意
当后端加密、前端解密时:
前端 crypto 框架传入的密文,需要传入 base64,不需要先进行 base64 解码为16进制数组,否则无法解密!
即:
后端加密:content -> encrptedContent -> base64-encrptedContent
前端解密:base64-encrptedContent -> content

1. 框架

  • 前端:crypto.js
  • 后端:Hutool Crypto 模块(使用 AES 类)

2. 代码

2.1. 后端

静态属性及初始化

    /**
     * key  加密密钥,长度为32位字符
     */
    private static final String KEY = "xxxx-xxxx-xxxx-x";

    /**
     * 使用CBC模式,需要一个向量,增强算法的强度
     */
    private static final String INIT_VECTOR = "yyyy-yyyy-yyyy-y";

    public static AES aesCoder = null;

    static {
        aesCoder = new AES(Mode.CBC, Padding.ISO10126Padding, KEY.getBytes(StandardCharsets.UTF_8),
                INIT_VECTOR.getBytes(StandardCharsets.UTF_8));
    }

加密

    public static String encode(String data) throws Exception {

        try {

            return aesCoder.encryptBase64(data.getBytes(StandardCharsets.UTF_8));

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

解密

    public static String decode(String data) throws Exception{
        try{

            byte[] decrypt = aesCoder.decrypt(data);

            return new String(decrypt, StandardCharsets.UTF_8);

        }catch (Exception e){
            throw new Exception(e);
        }
    }
2.2. 前端
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="node_modules/crypto-js/crypto-js.js"></script>
    <script type="text/javascript" src="node_modules/crypto-js/enc-base64.js"></script>
</head>

<body>
    <script type="module">

        // 开发中,不能直接写在代码里,可以放在 node.js 服务器
        var key = CryptoJS.enc.Utf8.parse('xxxx-xxxx-xxxx-x');

        var iv = CryptoJS.enc.Utf8.parse('yyyy-yyyy-yyyy-y');

        var content = '已加密的文本,进行测试,格式应该是 base64,16进制格式会报错';
    
        var source = CryptoJS.AES.decrypt(content, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Iso10126
        });

        console.log('source:' + source);

        var sourceText = source.toString(CryptoJS.enc.Utf8);

        console.log('sourceText:' + sourceText);


    </script>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容