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,则认为验证成功。