3.2.16 CodeSigner
CodeSigner类封装了代码签名者的信息,且它是不可变的,我们称它为代码签名。它和数字时间戳(java.security.Timestamp)紧密相连。
//用于构建代码签名
public final class CodeSigner
extends Object
implements Serializable
❑方法详述
CodeSigner类是一个终态类,可以通过其构造方法完成实力化对象:
//构造CodeSigner对象
public CodeSigner(CertPath signerCertPath, Timestamp timestamp)
完成实例化对象后,就可以通过以下方法获得其属性:
//返回签名者的CertPath对象
public CertPath getSignerCertPath()
//返回签名时间戳
public Timestamp getTimestamp()
注意,这里的Timestamp是java.security.Timestamp,是用做数字时间戳的Timestamp!
获得CodeSigner对象后的最重要的操作就是执行比对,CodeSigner覆盖了equals()方法:
//测试指定对象与此CodeSigner对象是否相等。
public boolean equals(Object obj)
如果,传入参数不是CodeSigner类的实现,则直接返回false。如果,传入参数是CodeSigner类的实现,则比较其Timestamp和CertPath两个属性,此方法的实现如代码清单3-14所示。
代码清单3-14 CodeSigner类equals()方法源代码片段
private CertPath signerCertPath;
private Timestamp timestamp;
//……
public boolean equals(Object obj){
if(obj==null||(!(obj instanceof CodeSigner))){
return false;
}
CodeSigner that=(CodeSigner)obj;
if(this==that){
return true;
}
Timestamp thatTimestamp=that.getTimestamp();
if(timestamp==null){
if(thatTimestamp!=null){
return false;
}
}else{
if(thatTimestamp==null||
(!timestamp.equals(thatTimestamp))){
return false;
}
}
return signerCertPath.equals(that.getSignerCertPath());
}
此外,CodeSigner还覆盖了以下两种方法:
//返回此代码签名者的散列码值。
public int hashCode()
//返回描述此代码签名者的字符串。
public String toString()
❑实现示例
我们接3.2.15节的代码实现,来构建一个代码签名,如代码清单3-15所示。
代码清单3-15 验证代码签名
//构建CertificateFactory对象,并指定证书类型为X.509。
CertificateFactory cf=CertificateFactory.getInstance("X509");
//生成CertPath对象
CertPath cp=cf.generateCertPath(new FileInputStream("D:\x.cer"));
//实例化Timestamp对象
Timestamp t=new Timestamp(new Date(),cp);
//实例化CodeSigner对象
CodeSigner cs=new CodeSigner(cp, t);
//获得比对结果
boolean status=cs.equals(new CodeSigner(cp, t));
得到CodeSigner对象后,可以使用它的equals()方法来进行比对。