3.2.14 SignedObject

SignedObject类是一个用来创建实际运行时对象的类,在检测不到这些对象的情况下,其完整性不会遭受损害。更明确地说,SignedObject包含另外一个Serializable对象,即要签名的对象及其签名,我们可以称它为签名对象。

签名对象是对原始对象的“深层复制”(以序列化形式),一旦生成了副本,对原始对象的进一步操作就不再影响该副本。


//实现对象与数字签名的封装。

public final class SignedObject

extends Object

implements Serializable


❑方法详述

签名对象通过以下构造方法完成实例化对象:


//通过任何可序列化对象构造SignedObject对象。

public SignedObject(Serializable object, PrivateKey signingKey, Signature signingEngine)


在完成上述实例化操作后,可通过以下方法获得封装后的对象和签名:


//获取已封装的对象。

public Object getObject()

//在已签名对象上按字节数组的形式获取签名。

public byte[]getSignature()


接着,可以通过公钥和Signature进行验证操作:


/使用指派的验证引擎,通过给定的验证密钥验证SignedObject中的签名是否为内部存储对象的有效签名。/

public boolean verify(PublicKey verificationKey, Signature verificationEngine)


此外,SignedObject还提供了以下方法:


//获取签名算法的名称。

String getAlgorithm()


❑实现示例

我们对3.2.13节中的签名验证代码稍作改动,如代码清单3-12所示。

代码清单3-12 数字签名对象处理


//待做数字签名的原始信息。

byte[]data="Data Signature".getBytes();

//实例化KeyPairGenerator对象,并指定DSA算法。

KeyPairGenerator keyPairGen=KeyPairGenerator.getInstance("DSA");

//初始化KeyPairGenerator对象。

keyPairGen.initialize(1024);

//生成KeyPair对象

KeyPair keyPair=keyPairGen.generateKeyPair();

//实例化Signature对象

Signature signature=Signature.getInstance(keyPairGen.getAlgorithm());


这里与3.2.13节略有不同:


//实例化SignedObject对象

SignedObject s=new SignedObject(data, keyPair.getPrivate(),signature);


我们通过另一种方式得到了签名:


//获得签名值

byte[]sign=s.getSignature();


验证方式也有所不同:


//验证签名

boolean status=s.verify(keyPair.getPublic(),signature);


在上述示例代码中,如果变量status值为true,则认为验证成功。