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()方法来进行比对。