用 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>