本教程是针对JDK 8编写的。本页面中描述的示例和实践未利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言特性的概述,请参阅Java语言变化。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参阅JDK发布说明。
现在您已经创建了公钥和私钥,可以准备对数据进行签名。在此示例中,您将对文件中包含的数据进行签名。 GenSig
从命令行获取文件名。可以使用Signature
类的实例来创建(或验证)数字签名。
签名数据,为该数据生成数字签名,需要执行以下步骤。
获取Signature对象:以下代码获取用于使用DSA算法生成或验证签名的Signature
对象,该算法与程序在上一步中生成密钥时使用的算法相同,参见生成公钥和私钥。
Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
注意:在指定签名算法名称时,还应包括签名算法所使用的消息摘要算法的名称。SHA1withDSA是一种指定DSA签名算法的方式,使用SHA-1消息摘要算法。
初始化Signature对象
在可以对Signature
对象进行签名或验证之前,必须对其进行初始化。签名的初始化方法需要一个私钥。使用上一步中命名为priv
的PrivateKey
对象中放置的私钥。
dsa.initSign(priv);
为Signature对象提供要签名的数据 该程序将使用作为第一个(也是唯一一个)命令行参数指定的文件的数据。程序将一次读取一个缓冲区的数据,并通过调用update
方法将其提供给Signature
对象。
FileInputStream fis = new FileInputStream(args[0]); BufferedInputStream bufin = new BufferedInputStream(fis); byte[] buffer = new byte[1024]; int len; while ((len = bufin.read(buffer)) >= 0) { dsa.update(buffer, 0, len); }; bufin.close();
生成签名
一旦所有数据都已提供给Signature
对象,就可以生成该数据的数字签名。
byte[] realSig = dsa.sign();