快速业务通道

关于Java对象序列化您不知道的5件事 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
 return age; }    public Person getSpouse() { return spouse; }    public void setFirstName(String value) { firstName =  value; }    public void setLastName(String value) { lastName =  value; }    public void setGender(Gender value) { gender = value;  }    public void setAge(int value) { age = value; }    public void setSpouse(Person value) { spouse = value;  }    public String toString()    {      return "[Person: firstName=" + firstName +        " lastName=" + lastName +        " gender=" + gender +        " age=" + age +        " spouse=" + spouse.getFirstName() +        "]";    }    private String firstName;    private String lastName;    private int age;    private Person spouse;    private Gender gender; }

序列化使用一个 hash,该 hash 是根据给定源文件中几乎所有东西 — 方法 名称、字段名称、字段类型、访问修改方法等 — 计算出来的,序列化将该 hash 值与序列化流中的 hash 值相比较。

为了使 Java 运行时相信两种类型实际上是一样的,第二版和随后版本的 Person 必须与第一版有相同的序列化版本 hash(存储为 private static final serialVersionUID 字段)。因此,我们需要 serialVersionUID 字段, 它是通过对原始(或 V1)版本的 Person 类运行 JDK serialver 命令计算出的 。

一旦有了 Person 的 serialVersionUID,不仅可以从原始对象 Person 的序 列化数据创建 PersonV2 对象(当出现新字段时,新字段被设为缺省值,最常见 的是“null”),还可以反过来做:即从 PersonV2 的数据通过反序列化得到 Person,这毫不奇怪。

2. 序列化并不安全

让 Java 开发人员诧异并感到不快的是,序列化二进制格式完全编写在文档 中,并且完全可逆。实际上,只需将二进制序列化流的内容转储到控制台,就足 以看清类是什么样子,以及它包含什么内容。

这对于安全性有着不良影响。例如,当通过 RMI 进行远程方法调用时,通过 连接发送的对象中的任何 private 字段几乎都是以明文的方式出现在套接字流 中,这显然容易招致哪怕最简单的安全问题。

幸运的是,序列化允许 “hook” 序列化过程,并在序列化之前和反序列化 之后保护(或模糊化)字段数据。可以通过在 Serializable 对象上提供一个 writeObject 方法来做到这一点。

关于Java对象序列化您不知道的5件事(4)

时间:2010-11-20 IBM Ted Neward

模糊化序列化数据

假设 Person 类中的敏感数据是 age 字段。毕竟,女士忌谈年龄。我们可以 在序列化之前模糊化该数据,将数位循环左移一位,然后在反序列化之后复位。(您可以开发更安全的算法,当前这个算法只是作为一个例子。)

为了 “hook” 序列化过程,我们将在 Person 上实现一个 writeObject 方 法;为了 “hook” 反序列化过程,我们将在同一个类上实现一个 readObject 方法。重要的是这两个方法的细节要正确 — 如果访问修改方法、参数或名称不 同于清单 4 中的内容,那么代码将不被察觉地失败,Person 的 age 将暴露。

清单 4. 模糊化序列化数据

public class Person    implements java.io.Serializable {    public Person(String fn, String ln, int a)    {      this.firstName = fn; this.lastName = ln; this.age =  a;  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号