Java对象加密传输需先序列化为字节流,再压缩(可选)、AES加密后传输;接收端逆向解密、解压、反序列化还原对象,全程须密钥/算法严格匹配,并注意密钥管理、serialVersionUID声明及反序列化安全。

Java 实现对象序列化流的加密传输与解密,核心在于**在序列化字节流生成后、写入网络或文件前进行加密,在反序列化前先完成解密**。不能直接对 ObjectOutputStream / ObjectInputStream 做“加壳”,而需在字节流层面嵌入加密/解密环节。整个流程是:对象 → 序列化为字节 → 加密 → 传输 → 解密 → 反序列化为对象。
加密传输的关键步骤
必须分四层串联处理:序列化 → 压缩(可选)→ 加密 → 输出;接收端则逆向:输入 → 解密 → 解压(可选)→ 反序列化。
- 对象先用 ObjectOutputStream 写入 ByteArrayOutputStream,获取原始字节流
- 对字节数组调用 AES 加密(推荐使用
Cipher.getInstance("AES/GCM/NoPadding"),带认证更安全) - 若需减小体积,可在加密前用 GZIPOutputStream 压缩字节流(注意:压缩必须在加密前,否则加密后数据无压缩价值)
- 将最终加密字节数组通过 Socket、HTTP Body 或其他通道发送
解密还原的核心逻辑
接收方拿到密文字节数组后,顺序执行逆操作,每一步都必须与发送方严格对应,否则会失败。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 用相同密钥和算法(如 AES/GCM)对密文解密,得到原始序列化字节(或压缩后的字节)
- 若发送端压缩过,则用 GZIPInputStream 解压,还原出标准序列化字节流
- 将解压后的字节数组包装为 ByteArrayInputStream,再套一层 ObjectInputStream
- 调用
readObject()完成反序列化,获得原始 Java 对象
安全与兼容性注意事项
仅加密不等于安全,还需关注密钥管理、算法选择和反序列化风险。
立即学习“Java免费学习笔记(深入)”;
- 避免硬编码密码(如
"123456"),应使用密钥派生函数(PBKDF2)从口令生成密钥,并保存盐值 - 务必显式声明 serialVersionUID,否则类结构微调(如新增字段)会导致反序列化抛
InvalidClassException - 敏感字段(如 token、密码)应加
transient,防止被序列化泄露;加密是对整体字节流保护,不是替代字段级脱敏 - 生产环境慎用 JDK 默认序列化——它存在反序列化漏洞(如 Apache Commons Collections 利用链),建议配合白名单校验或改用 JSON/Protobuf 等更安全格式
一个精简可用的加密序列化工具方法
以下为关键代码骨架(省略异常处理和资源关闭细节),聚焦主干逻辑:
// 发送端:对象 → 加密字节数组
public static byte[] encryptObject(Object obj, SecretKey key) throws Exception {<br>
byte[] raw = serialize(obj); // 先序列化<br>
byte[] compressed = compress(raw); // 可选压缩<br>
return aesEncrypt(compressed, key); // AES 加密<br>
}
// 接收端:加密字节数组 → 对象
public static <T> T decryptObject(byte[] encrypted, SecretKey key, Class<T> type) throws Exception {<br>
byte[] decrypted = aesDecrypt(encrypted, key); // AES 解密<br>
byte[] raw = decompress(decrypted); // 可选解压<br>
return (T) deserialize(raw); // 反序列化<br>
}

















