这篇Java实例教程根据JDK1.8。实例教程中的实例和实践活动不容易应用将来发行版中...在该例中你将根据VerSign程序来验证根据GenSign程序转化成的数字签名。为验证数字签名的真实性必须遵照一些流程。 VerSig导进一个公钥和一个特定数...
这篇Java实例教程根据JDK1.8。实例教程中的实例和实践活动不容易应用将来发行版中的提升提议。
验证数字签名
假如你有着一个早已转化成好的数字签名,你也就能够验证该数字签名的真实性。要保证这一点,你需要
数据信息
数字签名
用以对数据信息签字的公钥相匹配的公钥
在该例中你将根据VerSign程序来验证根据GenSign程序转化成的数字签名。为验证数字签名的真实性必须遵照一些流程。
VerSig导进一个公钥和一个特定数据库文件的签字,随后验证签字的真实性。根据命令行参数来特定公钥,签名文件和数据库文件的姓名。
建立VerSig实例程序来导进文档并验证签字的流程以下所显示:
1. 提前准备复位程序结构
建立一个名叫VerSig.java的文本文档。键入原始程序结构(import句子、类名、main方式 等)。
它是本节课接下去的一部分中建立的VerSig程序的基础构造。将这一程序结构放到一个名叫VerSig.java的文档中。
import java.io.*;
import java.security.*;
import java.security.spec.*;
class VerSig {
public static void main(String[] args) {
/* Verify a DSA signature */
if (args.length != 3) {
System.out.println("Usage: VerSig "
"publickeyfile signaturefile " "datafile");
}
else {
try {
// the rest of the code goes here
} catch (Exception e) {
System.err.println("Caught exception " e.toString());
}
}
}
}
留意:
验证数据信息的方式 都会java.security库中,因此 该例将全部包都导进进去。该程序也导进了java.io包是由于必须读取文件中用于验证签字的数据信息,导进java.security.spec包是为了更好地导进X509EncodedKeySpec类。
该例必须三个主要参数,各自特定公钥、签字和待验证的文档。
该例中接下去流程中的代码块将坐落于try catch中间
2.键入并变换被编号的公钥字节数数字能量数组
从cmd第一个主要参数特定的文档中载入被编号的公钥字节数并将它变换为PublicKey目标。
接下去,VerSig必须从特定为第一个命令行参数的文档中导进已编号的公钥字节数,并将其变换为公钥。必须公钥,由于签字initVerify方式 必须公钥来复位签字目标以开展验证。
最先,载入已编号的公钥字节数。
FileInputStream keyfis = new FileInputStream(args[0]);
byte[] encKey = new byte[keyfis.available()];
keyfis.read(encKey);
keyfis.close();
如今字节数数字能量数组encKey包括已编号的公钥字节数。
能够应用KeyFactory从已编号的公钥字节数中实例化一个DSA的公钥Key。KeyFactory类出示不全透明密匙(种类为Key)和密匙标准中间的变换,后面一种是最底层密匙原材料的表明。应用不全透明密匙,能够得到优化算法名字、文件格式名字和已编号的密匙字节数,但不可以得到密匙原材料,比如,密匙原材料很有可能由密钥自身和用以测算密匙的优化算法主要参数构成。(留意,因为它拓展了Key,因此 PublicKey自身便是一个Key。)
因而,最先必须一个密匙标准。假定密匙是依照X.509规范编号的,比如,假如密匙是由SUN出示的内嵌DSA密匙对制作器转化成的,则能够根据下列方式 得到密匙:
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
如今必须一个KeyFactory目标来实行变换。该目标务必是一个与DSA密匙一起工作中的目标。
KeyFactory keyFactory = KeyFactory.getInstance(“DSA”, “SUN”);
最终,能够应用KeyFactory目标依据密匙标准转化成公钥。
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
3. 键入签字数字能量数组
从cmd第二个主要参数特定的文档中载入签字字节数。
接下去,从第二个命令行参数特定的文档中载入签字字节数。
FileInputStream sigfis = new FileInputStream(args[1]);
byte[] sigToVerify = new byte[sigfis.available()];
sigfis.read(sigToVerify);
sigfis.close();
如今字节数数字能量数组sigToVerify包括签字字节数。
4.验证签字
获得一个Signature目标并且用公钥复位它,以验证签字。将第三个命令行参数特定的文档出示给Signature目标并验证其签字。
如今早已向VerSig程序加上了以下编码:
载入已编号的密匙字节数,并将其变换为名叫pubKey的公钥
将签字字节数载入到名叫sigToVerify的字节数数字能量数组
现在可以实行验证了。
1). 复位用于验证的签字目标
与签名生成一样,签字验证是根据应用签字类的案例来进行的。必须建立一个转化成签字应用同样签字优化算法的签字目标。GenSig程序应用的优化算法来源于SUN出示的SHA2withDSA优化算法。
Signature sig = Signature.getInstance(“SHA2withDSA”, “SUN”);
接下去,必须复位签字目标。验证的复位方式 必须公钥。
sig.initVerify(pubKey);
2). 向签字目标出示要验证的数据信息
如今必须向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();
3). 验证签字
一旦向Signature目标出示了全部数据信息,就可以验证该数据信息的数字签名并转化成結果。回忆一下,说白了的签字被读取一个名叫sigToVerify的字节数数字能量数组。
boolean verifies = sig.verify(sigToVerify);
System.out.println("signature verifies: " verifies);
假如说白了的签字(sigToVerify)是与公钥pubKey相匹配的公钥转化成的特定数据库文件的具体签字,那麼verify数值true。
5.编译程序并运作程序
这儿是VerSig.java程序的全部源代码。
编译程序并运作该实例程序。记牢,你需要在cmd中特定三个主要参数:
包括已编号公钥字节数文档的姓名
包括签字字节数的姓名
源数据库文件的姓名(转化成数字签名的文档)
假如你检测了GenSig程序的輸出,那麼应当应用的文件夹名称应该是
suepk
sig
data
这是一个样版运作;粗字体表明你输入的內容。
java VerSig suepk sig data
signature verifies: true
收拢
展开全文
文章转载自网络,如有侵权,请联系api@1dq.com删除