3.3.8 SealedObject

SealedObject类使程序员能够用加密算法创建对象并保护其机密性。


//此类使程序员能够用加密算法创建对象并保护其机密性。

public class SealedObject

extends Object

implements Serializable


❑方法详述

通过以下方法可以构建一个实例化对象:


//从序列化对象构造一个SealedObject。

public SealedObject(Serializable object, Cipher c)


在给定任何Serializable对象的情况下,程序员可以序列化格式(即“深层复制”)封装原始对象的SealedObject,并使用DES一类的加密算法密封(加密)其序列化的内容,以保护其机密性。加密的内容以后可以解密(使用相应的算法和正确的解密密钥)和反序列化,并生成原始对象。

注意,该Cipher对象在应用于SealedObject之前必须使用正确的算法、密钥、填充方案等进行完全初始化。

已密封的原始对象可以用以下两种方式恢复:

·使用采用Cipher对象的getObject()方法。

此方法需要一个完全初始化的Cipher对象,用极其相同的用来密封对象的算法、密钥、填充方案等进行初始化。

这样做的好处是解封密封对象的一方不需要知道解密密钥。例如,一方用所需的解密密钥初始化Cipher对象之后,它就会将Cipher对象移交给以后要解封密封对象的另一方。

·使用采用Key对象的getObject()方法。

在此方法中,getObject()方法创建一个用于适当解密算法的Cipher对象,并用给定的解密密钥和存储在密封对象中的算法参数(如果有)对其进行初始化。

这样做的好处是解封此对象的一方不需要跟踪用来密封该对象的参数(如IV,初始化向量)。

使用采用Cipher对象的getObject()方法:


//获取原始(封装的)对象。

public final Object getObject(Cipher c)


使用采用Key对象的getObject()方法:


//获取原始(封装的)对象。

public final Object getObject(Key key)

//获取原始(封装的)对象。

public final Object getObject(Key key, String provider)


此外,提供如下常用方法:


//返回用于密封此对象的算法。

public final String getAlgorithm()


❑实现示例

我们通过代码清单3-20展示如何对对象加密。

代码清单3-20 对象加密处理


//待加密的字符串对象。

String input="SealedObject";

//实例化KeyGenerator对象,使用DES算法。

KeyGenerator kg=KeyGenerator.getInstance("DES");

//创建秘密密钥

SecretKey key=kg.generateKey();

//实例化用于加密的Cipher对象cipher1。

Cipher cipher1=Cipher.getInstance(key.getAlgorithm());

//初始化

cipher1.init(Cipher.ENCRYPT_MODE, key);

//构建SealedObject对象

SealedObject sealedObject=new SealedObject(input, cipher1);

//实例化用于解密的Cipher对象cipher2。

Cipher cipher2=Cipher.getInstance(key.getAlgorithm());

//初始化

cipher2.init(Cipher.DECRYPT_MODE, key);

//获得解密后的字符串对象。

String output=(String)sealedObject.getObject(cipher2);