JSR223预处理器加密后生成乱码,如何生成网站可识别的AES登录密钥?
问题解决:AES加密后生成乱码导致Base64解码报错
问题根源
你遇到的乱码和StringIndexOutOfBoundsException本质是同一个问题:
- AES加密输出的是二进制字节数组,直接用
new String(encrypted)转字符串会因为二进制字节无法映射为合法字符集(如UTF-8)出现乱码。 - 服务器端的
decodeBase64方法期望接收标准Base64编码字符串,乱码字符串不符合Base64格式,解码时就会抛出索引越界异常。
修复步骤
1. 对加密后的字节数组做Base64编码
在Groovy代码中,加密完成后不要直接转字符串,而是将二进制字节数组编码为标准Base64字符串。Groovy可直接使用JDK自带的Base64工具类(注意要和网站原生encrypt.js的Base64编码规则一致,比如是否使用URL安全变体):
// 假设encrypted是AES加密后的byte[] def base64Encrypted = Base64.getEncoder().encodeToString(encrypted)
2. 修正参数传递代码
将Base64编码后的字符串存入变量,替换原来的直接转字符串逻辑:
vars.put("a3", base64Encrypted);
3. 额外验证点
确保你的Groovy AES实现和网站原生encrypt.js的以下参数完全一致,否则即使Base64编码正确,服务器也会认证失败:
- AES密钥(长度、编码方式,比如是否从字符串转成UTF-8字节)
- 加密模式(比如ECB/CBC,CBC需要IV向量的话要和前端一致)
- 填充方式(比如PKCS5Padding/PKCS7Padding)
- Base64编码类型(是否使用URL安全的Base64,即替换
+为-、/为_,是否省略末尾的=)
示例修正后代码片段
// 假设已完成AES加密得到byte[] encrypted def base64Encrypted = Base64.getEncoder().encodeToString(encrypted) vars.put("a3", base64Encrypted)
内容的提问来源于stack exchange,提问作者Nelza
相关产品推荐
相关产品推荐

