- 浏览: 58086 次
- 性别:
- 来自: 上海
文章分类
最新评论
声明:因为准备在项目组内部做一次关于序列化的分享,故有如此一系列关于序列化的博文产生。次系列期间参考了一些其他的资料,如《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); } }
发表评论
-
JVM参数以及调优
2011-10-24 23:39 838一、JVM配置参数中文说明: 1、-Xmixed ... -
分布式服务框架之NIO(一)
2011-10-22 23:08 1348NIO在实现分布式服务框架中非阻塞高并发的服务器端功能 ... -
Spring声明线程池配置示例
2011-09-13 14:19 770<bean id="***Ta ... -
HTTPS下载的问题
2011-08-31 17:18 1767遇到一个很恶心的问题,开发以及测试环境是http协议,下 ... -
实现自己的csv文件解析引擎
2011-08-26 14:29 1492前言: 这里仅仅支持Excel文件导出的CSV文件,解 ... -
迷茫了
2011-08-08 23:09 770又迷茫了,感觉没事可做,什么都不想做 实际并不是没事可做,实 ... -
通用的excel报表生成工具类
2011-07-20 20:41 1155下面这个工具类是今天半天的劳动成果。 以后自己也可能用得到。 ... -
正则表达式元字符总结
2011-07-14 23:22 956正则表达式元字符总结如下: 点号(.):任何单字符的通 ... -
多并发情况下日志信息中如何区分不同线程(客户端)调用
2011-07-13 21:57 1433在企业开发中,常常会遇到这样的需求:通过一个唯一标 ... -
windows下perl开发环境搭建
2011-07-09 22:07 69361、下载并安装ActivePerl,貌似不需要额外的配置,一步 ... -
如何让右键菜单出现“命令行在这里”,即cmd here
2011-06-29 00:24 4750要在命令行下跳转到某个嵌套很深的目录下时,使用cd命令等比 ... -
使用JMock简介
2011-06-28 13:36 987一、常用关键字 one ... -
利用数据库锁实现简单的防并发编程
2011-06-22 23:27 1134大约有两类情况: 1、一个程序代码块同一时刻只允许一个 ... -
程序员如何减少BUG
2011-06-21 22:04 2541最近一个项目出了大量的BUG,很是惭愧,有没有可以尽量规避BU ... -
一些常用的正则表达式(项目中经常用到)
2011-06-15 17:11 8148最近做的一个内部系统项目,涉及大量的文本校验,里面用到了一些常 ... -
解析Excel文件转换科学计数法字符串为正常数字
2011-06-14 22:55 5686问题出现的情形是这样的: excel文件中某个字段,既 ... -
js正则表达式去除表单提交字符串前后的空格
2011-06-13 19:31 1476str为表单提交数据。 str=str.replace ... -
debug容器启动类报MMO异常解决办法
2011-06-10 19:58 748类似的,在eclipse的VM arguments中设置参数: ... -
理想的设计特征
2011-06-09 00:57 738其实下面这些是来自于代码大全,觉得讲得实在是精辟无比,想摘抄下 ... -
最近的几点关于编码的心得
2011-05-25 00:35 6841、编写一个类或者新建一个变量的时候,名字问题需要仔细的斟酌斟 ...
相关推荐
#### 二、揭秘 DataSet 序列化的内幕 在Web Service中,DataSet作为常用的数据容器,在数据传输过程中扮演着重要角色。然而,原始的DataSet序列化方式存在较大的数据冗余,尤其是在包含大量数据时,这不仅增加了...
开发者将学习如何利用Spring MVC,结合@Controller、@RequestMapping等注解定义HTTP端点,以及如何使用Jackson库进行JSON序列化和反序列化。此外,还会介绍Spring Data JPA和Hibernate,用于简化数据库操作,实现ORM...
对于网络编程,书中会介绍如何使用HTTP协议进行数据交换,以及使用JSON或XML格式进行数据序列化和反序列化。同时,还会讲解如何实现异步任务处理,比如使用AsyncTask或Handler,以避免阻塞UI线程。 进一步,书中的...
书中将解释HTTP协议,Web API的控制器和路由,以及数据序列化等。 5. **ASP.NET Core**:第二版还可能涵盖了ASP.NET Core,这是跨平台的下一代ASP.NET框架。ASP.NET Core集成了Web Forms、MVC和Web API,具有高性能...
根据提供的文件信息,我们可以推断出这是一本关于生物学的书籍,书名为《揭秘系列-生物学》(Biology Demystified),作者为Hon. Dr. Dale Pierre Layman, Ph.D.,出版方为McGraw-Hill。接下来,我们将根据这些信息...
《MATLAB揭秘》是由David McMahon撰写,郑碧波翻译的一本深入探讨MATLAB科学计算的书籍。MATLAB,全称Matrix Laboratory,是一款广泛应用于工程、数学、科学领域的高性能计算环境,以其强大的矩阵运算和可视化功能...
在理想情况下,这个组合的数据流将是一个以fs速率更新的n位数据序列,从而达到提高整体采样速率的目的。 然而,在交错过程中,每个通道的输出需要重新组装,这会导致一些技术难题。例如,交错过程可能引入所谓的...
7. **媒体类型格式化**:Web API可以自动序列化和反序列化数据,使其能以不同的格式(如JSON或XML)传输。这部分将讨论如何处理不同的数据格式。 8. **测试与调试**:介绍如何测试Web API服务,包括单元测试、集成...
- 读写文件:MATLAB可以通过fread、fwrite、textscan等函数读取二进制或文本文件,save和load函数用于序列化和反序列化MATLAB变量。 - 数据导入导出:可以将数据导入到MATLAB工作空间,或者导出为其他格式(如CSV...
开发者将了解如何使用HttpURLConnection或OkHttp库发送网络请求,以及如何处理JSON数据,如使用Gson或Jackson库进行序列化和反序列化。 第14章可能会讲解Android的权限管理和安全相关的话题。随着Android系统的更新...
这一章可能详细讲解了使用HTTP/HTTPS进行网络请求,如使用Android的HttpURLConnection、OkHttp库或者Retrofit库进行网络请求,还有JSON解析(Gson或Jackson)以及数据的序列化和反序列化。 4. **第14章**:可能涉及...
- JSON解析:介绍如何使用Gson、Jackson或org.json库解析和序列化JSON数据。 通过以上章节的学习,开发者可以掌握Android应用开发的基础和进阶技巧,包括界面设计、程序流程控制、数据管理和网络通信等关键领域。...
《Prototype和script.aculo.us终极揭秘》是一本深入探讨JavaScript库Prototype和script.aculo.us的专业书籍,旨在帮助开发者掌握这两个强大的工具,提升Web应用程序的用户体验和交互性。这本书的试读样章为我们提供...
在软件开发领域,Hessian是一种高效的二进制序列化协议,它由Caucho Technology公司开发,常用于实现远程方法调用(RMI)和Web服务。本次我们将深入探讨Hessian 4.0.7版本,包括其jar包的使用以及源码分析,帮助...
1. 内存管理:通过Tungsten项目,Spark实现了自定义的内存管理,优化了数据序列化和反序列化,减少GC开销。 2. 数据本地性:Spark会尽可能地将任务调度到数据所在的节点执行,提高数据读取速度。 3. 执行计划优化...
这几个附录远远超出了简单的汇编语言参考向导,讲述了公共代码段(common code fragments)和常用编译器对几种典型的代码序列表现出来的编译器习性(complier idioms),并介绍了识别和破解它们的方法。
通过序列化Java对象,GWT可以自动处理客户端与服务器间的类型转换和通信细节。 6. **源码分析** 书中的"part1,2,3"可能分别涵盖了GWT的基础、进阶和实战内容。通过源码学习,开发者可以了解GWT内部如何处理事件、...
《MATLAB揭秘》是David McMahon撰写的一本专著,由郑碧波翻译成中文,旨在深入探讨MATLAB这一强大的数学和工程计算软件。MATLAB(矩阵实验室)是全球科研人员、工程师和学者广泛使用的工具,它提供了丰富的数学函数...