Android中Gson JsonObject转Base64再AES256加密后JSON格式异常
问题分析与解决方案
你遇到的JSON格式错误问题,核心是多做了一次不必要的Base64编码,导致服务器解密后得到的不是原始JSON字符串,而是Base64编码后的文本,自然无法正常解析为JSON格式。
错误流程拆解
你当前的处理步骤存在冗余:
- JsonObject → JSON字符串
- JSON字符串 → UTF-8字节 → Base64编码字符串
- Base64字符串 → 字节 → AES加密
- 加密字节 → Base64编码字符串(最终发送内容)
步骤2的Base64编码完全是多余操作,它会让后续加密的对象从原始JSON字节流变成Base64文本的字节流,服务器解密后得到的是Base64格式的字符串,而非原始JSON,因此触发格式错误。
修正后的正确代码
// 1. 构建目标JsonObject JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("command", "abc"); // 2. 直接将JSON字符串转为UTF-8字节,跳过不必要的Base64编码 byte[] jsonBytes = jsonObject.toString().getBytes(StandardCharsets.UTF_8); // 3. 对原始JSON字节执行AES加密 byte[] encryptedBytes = aesKeyIv.cipherEnc.doFinal(jsonBytes); // 4. 将加密后的字节转为Base64字符串,用于网络发送 String finalBody = Base64.encodeToString(encryptedBytes, Base64.NO_WRAP);
同时建议调整你的加密方法,直接接收字节参数,减少不必要的字符串-字节转换,避免编码隐患:
public String encrypt(byte[] valueBytes) throws Exception { byte[] encrypted = cipherEnc.doFinal(valueBytes); return Base64.encodeToString(encrypted, Base64.NO_WRAP); }
调用时直接传入jsonBytes即可:
String finalBody = aesKeyIv.encrypt(jsonBytes);
额外注意事项
- 确保
cipherEnc的初始化符合AES-256要求:比如使用AES/GCM/NoPadding(更安全)或AES/CBC/PKCS5Padding模式,密钥长度必须为32字节,CBC模式下IV长度需为16字节。 - 始终明确指定字符编码(比如
StandardCharsets.UTF_8),避免依赖系统默认编码,防止不同设备/平台出现编码不一致问题。
内容的提问来源于stack exchange,提问作者user6683139
相关产品推荐
相关产品推荐

