Java教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发行说明。
您已经将代码添加到VerSig
程序中,以
pubKey
的PublicKey
sigToVerify
的字节数组中您现在可以继续进行验证。
初始化用于验证的签名对象
与签名生成一样,签名是通过使用Signature
类的实例来验证的。您需要创建一个使用与生成签名相同的签名算法的Signature
对象。在GenSig
程序中使用的算法是来自SUN提供者的SHA1withDSA算法。
Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
接下来,您需要初始化Signature
对象。验证的初始化方法需要公钥。
sig.initVerify(pubKey);
为签名对象提供要验证的数据 现在,您需要为Signature
对象提供生成签名的数据。这些数据位于指定为第三个命令行参数的文件中。与签名时一样,一次读入一个缓冲区的数据,并通过调用update
方法将其提供给Signature
对象。
FileInputStream datafis = new FileInputStream(args[2]); BufferedInputStream bufin = new BufferedInputStream(datafis); byte[] buffer = new byte[1024]; int len; while (bufin.available() != 0) { len = bufin.read(buffer); sig.update(buffer, 0, len); }; bufin.close();
验证签名
一旦您向Signature
对象提供了所有数据,您可以验证该数据的数字签名并报告结果。请记住,所谓的签名被读入一个名为sigToVerify
的字节数组中。
boolean verifies = sig.verify(sigToVerify); System.out.println("signature verifies: " + verifies);
如果所谓的签名(sigToVerify
)是由与公钥pubKey
对应的私钥生成的指定数据文件的实际签名,则verifies
值将为true
。