Java对象序列化需手动加密:先用ObjectOutputStream写入ByteArrayOutputStream获取字节数组,再AES/GCM加密后传输;接收端逆序解密、解压(可选)、反序列化,并配合serialVersionUID、transient、反序列化过滤及密钥安全管理。

Java 中对象序列化本身不提供传输安全,必须在序列化字节流生成后、网络发送前主动加密,接收端再解密后反序列化。核心是把加密嵌入到字节流处理环节,而不是对 ObjectOutputStream / ObjectInputStream 做包装。
先序列化成字节,再加密
不能直接让 ObjectOutputStream 写进 SocketOutputStream 就完事。正确做法是:
- 用 ObjectOutputStream 写入 ByteArrayOutputStream,拿到原始字节数组
- 对这个字节数组调用 AES 加密(推荐 AES/GCM/NoPadding,带完整性校验)
- 把加密后的字节数组通过 Socket、HTTP 或其他通道发送
接收端严格逆向还原
解密和反序列化顺序不能错,每一步都必须与发送端完全对应:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 收到密文字节数组后,先用相同密钥和算法解密,得到原始序列化字节
- 将解密后的字节数组封装为 ByteArrayInputStream
- 用 ObjectInputStream 读取该输入流,完成反序列化
- 若中途某步参数不一致(如 GCM 的 nonce、密钥、算法模式),会直接失败或抛出 InvalidKeyException / AEADBadTagException
关键安全细节不能漏
光加密还不够,还得配合以下机制才能真正防攻击:
立即学习“Java免费学习笔记(深入)”;
- 显式声明 serialVersionUID:避免因类结构变更导致反序列化失败,也防止恶意篡改类版本绕过校验
- 敏感字段加 transient:比如密码、token 等字段,从源头就不参与序列化
- 禁用危险的反序列化入口:生产环境慎用 ObjectInputStream,考虑用 Jackson/Gson 替代,或启用 JDK 的反序列化过滤器(jdk.serialFilter)
- 密钥不硬编码:用 KMS、环境变量或配置中心管理密钥,AES 密钥长度建议 256 位
可选但推荐:压缩 + 加密组合
如果传输体积大,可在加密前加一层压缩,但注意顺序:
- 必须 先压缩、再加密 —— 加密后数据接近随机分布,无法压缩
- 用 GZIPOutputStream 包裹 ByteArrayOutputStream,再写入 ObjectOutputStream
- 接收端先解密,再用 GZIPInputStream 解压,最后反序列化

















