关于Java对象序列化您不知道的5件事 - 编程入门网
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. 模糊化序列化数据
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |