`
liyebing
  • 浏览: 58086 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

序列化揭秘(一)

阅读更多

   声明:因为准备在项目组内部做一次关于序列化的分享,故有如此一系列关于序列化的博文产生。次系列期间参考了一些其他的资料,如《java加密与解密的艺术》,java官方序列化规范文档等资料,来源相对较杂,在此不一一说明,后续也不再说明。仅致以最诚挚的感谢!此为原创,转载请说明出处   -----哲渊2011-4-10

 

   序列化的二进制数据几乎是以明文的形式在网络传输,这样会存在比较大的安全问题。解决方案之一如下:

对整个对象进行加密和签名,最简单的是将它放在一个 javax.crypto.SealedObject  或 java.security.SignedObject 包装器中。两者都是可序列化的,所以将对象包装在 SealedObject 中可以围绕原对象创建一种 “包装盒”。必须有对称密钥才能解密,而且密钥必须单独管理。同样,也可以将 SignedObject 用于数据验证,并且对称密钥也必须单独管理。以下代码解释了以SignedObject为例说明如何进行整个对象的序列化安全加密和解密。

 

需要序列化的原始类代码:

package zheyuan.experiment4.com;

import java.io.Serializable;

/**
 * 用于被密钥包装的类
 * 
 * @author Administrator
 * 
 */
public class SignedPerson implements Serializable {

	private static final long serialVersionUID = 8533862948800025300L;

	private String name;
	private int age;
	private boolean isNB;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public boolean isNB() {
		return isNB;
	}

	public void setNB(boolean isNB) {
		this.isNB = isNB;
	}

}



序列化类的加密解密类代码如下:

package zheyuan.experiment4.com;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;
import java.security.SignedObject;

public class SignedSerializableTest {

	/**
	 *    如果需要对整个对象进行加密和签名,最简单的是将它放在一个 javax.crypto.SealedObject 
	 *    或 java.security.SignedObject 包装器中。两者都是可序列化的,所以将对象包装在 SealedObject 
	 *    中可以围绕原对象创建一种 “包装盒”。必须有对称密钥才能解密,而且密钥必须单独管理。
	 *    同样,也可以将 SignedObject 用于数据验证,并且对称密钥也必须单独管理。 
	 *    
	 *    这里以SignedObject为例说明
	 */
	
	/**
	 * 演示如何对序列化数据进行签名加密
	 * @param args
	 */
	public static void main(String[] args) throws Throwable{
		SignedPerson signedPerson=new SignedPerson();
		signedPerson.setAge(18);
		signedPerson.setName("zheyuan");
		signedPerson.setNB(false);
		
		signedSerializableData(signedPerson);
	}
	
	static void signedSerializableData(Object signedPerson) throws Throwable{
		//-----------第一步:密钥武装序列化类--------------------
		
		//代做数字签名的原始信息(必须实现Serializable接口)
		Serializable o=(Serializable)signedPerson;
		//实例化KeyPairGenerator(密钥生成器)对象,并指定DSA算法
		KeyPairGenerator keyPairGen=KeyPairGenerator.getInstance("DSA");
		//初始化KeyPairGenerator对象
		int keysize=1024;
		keyPairGen.initialize(keysize);
		//生成KeyPair对象
		KeyPair keyPair=keyPairGen.generateKeyPair();
		//实例化Signature(用来生成和验证数字签名,是一个引擎类)对象
		Signature signature=Signature.getInstance(keyPairGen.getAlgorithm());
		//实例化SignedObject对象
		SignedObject sin=new SignedObject(o,keyPair.getPrivate(),signature);
		
		//----------第二步:将密钥武装后序列化类SignedObject序列化------------
		OutputStream out=new FileOutputStream("signed_temp");
		ObjectOutputStream oos=new ObjectOutputStream(out);
		oos.writeObject(sin);
		//-----------第三步:SignedObject反序列化-----------------------
		
		InputStream in=new FileInputStream("signed_temp");
		ObjectInputStream ois=new ObjectInputStream(in);
		SignedObject sout=(SignedObject)ois.readObject();
		
        //-------------第四步:将原始类信息解密-----------------		
		//获得签名值
		Object sign=sout.getObject();
		System.out.println(sign.toString());
		//验证签名
		boolean status=sout.verify(keyPair.getPublic(), signature);
		System.out.println(status);
		
	}

}


 
分享到:
评论

相关推荐

    实战 Web Service 压缩传输

    #### 二、揭秘 DataSet 序列化的内幕 在Web Service中,DataSet作为常用的数据容器,在数据传输过程中扮演着重要角色。然而,原始的DataSet序列化方式存在较大的数据冗余,尤其是在包含大量数据时,这不仅增加了...

    SpringBoot揭秘 快速构建微服务体系_SpringSprintBoot揭秘_

    开发者将学习如何利用Spring MVC,结合@Controller、@RequestMapping等注解定义HTTP端点,以及如何使用Jackson库进行JSON序列化和反序列化。此外,还会介绍Spring Data JPA和Hibernate,用于简化数据库操作,实现ORM...

    Android应用开发揭秘

    对于网络编程,书中会介绍如何使用HTTP协议进行数据交换,以及使用JSON或XML格式进行数据序列化和反序列化。同时,还会讲解如何实现异步任务处理,比如使用AsyncTask或Handler,以避免阻塞UI线程。 进一步,书中的...

    asp.net揭秘(第二版)

    书中将解释HTTP协议,Web API的控制器和路由,以及数据序列化等。 5. **ASP.NET Core**:第二版还可能涵盖了ASP.NET Core,这是跨平台的下一代ASP.NET框架。ASP.NET Core集成了Web Forms、MVC和Web API,具有高性能...

    揭秘系列-生物学]Biology.Demystified.pdf

    根据提供的文件信息,我们可以推断出这是一本关于生物学的书籍,书名为《揭秘系列-生物学》(Biology Demystified),作者为Hon. Dr. Dale Pierre Layman, Ph.D.,出版方为McGraw-Hill。接下来,我们将根据这些信息...

    MATLAB 揭秘 David McMahon 著 郑碧波 译

    《MATLAB揭秘》是由David McMahon撰写,郑碧波翻译的一本深入探讨MATLAB科学计算的书籍。MATLAB,全称Matrix Laboratory,是一款广泛应用于工程、数学、科学领域的高性能计算环境,以其强大的矩阵运算和可视化功能...

    交错ADC揭秘.pdf

    在理想情况下,这个组合的数据流将是一个以fs速率更新的n位数据序列,从而达到提高整体采样速率的目的。 然而,在交错过程中,每个通道的输出需要重新组装,这会导致一些技术难题。例如,交错过程可能引入所谓的...

    ASP.NET Web API 2 框架揭秘-带源码版--蒋金楠(大内老A)

    7. **媒体类型格式化**:Web API可以自动序列化和反序列化数据,使其能以不同的格式(如JSON或XML)传输。这部分将讨论如何处理不同的数据格式。 8. **测试与调试**:介绍如何测试Web API服务,包括单元测试、集成...

    MATLAB揭秘.zip

    - 读写文件:MATLAB可以通过fread、fwrite、textscan等函数读取二进制或文本文件,save和load函数用于序列化和反序列化MATLAB变量。 - 数据导入导出:可以将数据导入到MATLAB工作空间,或者导出为其他格式(如CSV...

    《Android应用开发揭秘》源码8-16

    开发者将了解如何使用HttpURLConnection或OkHttp库发送网络请求,以及如何处理JSON数据,如使用Gson或Jackson库进行序列化和反序列化。 第14章可能会讲解Android的权限管理和安全相关的话题。随着Android系统的更新...

    Android应用开发揭秘-书籍所需源码

    这一章可能详细讲解了使用HTTP/HTTPS进行网络请求,如使用Android的HttpURLConnection、OkHttp库或者Retrofit库进行网络请求,还有JSON解析(Gson或Jackson)以及数据的序列化和反序列化。 4. **第14章**:可能涉及...

    android应用开发揭秘

    - JSON解析:介绍如何使用Gson、Jackson或org.json库解析和序列化JSON数据。 通过以上章节的学习,开发者可以掌握Android应用开发的基础和进阶技巧,包括界面设计、程序流程控制、数据管理和网络通信等关键领域。...

    《Prototype and script.aculo.us终极揭秘》

    《Prototype和script.aculo.us终极揭秘》是一本深入探讨JavaScript库Prototype和script.aculo.us的专业书籍,旨在帮助开发者掌握这两个强大的工具,提升Web应用程序的用户体验和交互性。这本书的试读样章为我们提供...

    hessian-4.0.7.jar + src

    在软件开发领域,Hessian是一种高效的二进制序列化协议,它由Caucho Technology公司开发,常用于实现远程方法调用(RMI)和Web服务。本次我们将深入探讨Hessian 4.0.7版本,包括其jar包的使用以及源码分析,帮助...

    spark内核揭秘

    1. 内存管理:通过Tungsten项目,Spark实现了自定义的内存管理,优化了数据序列化和反序列化,减少GC开销。 2. 数据本地性:Spark会尽可能地将任务调度到数据所在的节点执行,提高数据读取速度。 3. 执行计划优化...

    《逆向工程揭秘》中文版 共3部分.part1

    这几个附录远远超出了简单的汇编语言参考向导,讲述了公共代码段(common code fragments)和常用编译器对几种典型的代码序列表现出来的编译器习性(complier idioms),并介绍了识别和破解它们的方法。

    gwt 揭秘 源码

    通过序列化Java对象,GWT可以自动处理客户端与服务器间的类型转换和通信细节。 6. **源码分析** 书中的"part1,2,3"可能分别涵盖了GWT的基础、进阶和实战内容。通过源码学习,开发者可以了解GWT内部如何处理事件、...

    MATLAB揭秘中文版-扉页.doc

    《MATLAB揭秘》是David McMahon撰写的一本专著,由郑碧波翻译成中文,旨在深入探讨MATLAB这一强大的数学和工程计算软件。MATLAB(矩阵实验室)是全球科研人员、工程师和学者广泛使用的工具,它提供了丰富的数学函数...

Global site tag (gtag.js) - Google Analytics