java结合keytool实现非对称签名和验证的方法

  介绍

这篇文章主要介绍java结合keytool实现非对称签名和验证的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

<强> keytool的使用

keytool是JDK自带的一个密钥库管理工具。这里只用到了keytool的部分功能,包括生成密钥对,导出公钥等.keytool生成的公/私钥钥对存放到一个到了一个文件中,这个文件有密码保护,通称为密钥库。

<强>生成密钥对

,美元keytool  -genkey  -alias  signLegal  -keystore  examplestanstore  -validity  1800年

生成别名为signLegal的密钥对,存放在密钥库examplestanstore中,证书的有效期是1800天(默认是90天)。

输入一系列的参数。输入的参数遵循了LDAP的风格和标准。可以想象,生成的密钥对可以看成LDAP的一个条目。

命令执行成功后会在当前目录下创建一个叫examplestanstore的文件。

<强>查看密钥对

,美元keytool  -list  -keystore  examplestanstore  - v

列出了examplestanstore密钥库的中所有密钥对v。参数表示详细信息,详细信息中有证书的失效时间。

<>强导出公钥证书

,美元keytool  -export  -keystore  examplestanstore  -alias  signLegal  -file  StanSmith.cer

导出的公钥存放在当前目录的StanSmith。cer文件中,是个二进制文件。

<强> java签名和验证

参考了java安全官方教程。

在该官方教程中,GenSig.java类生成密钥对,对输入的文件进行签名,输出了一个签名结果文件团体和公钥suepk。

VerSig.java类接受三个参数:公钥文件名(suepk),签名文件(团体),被签名的源文件名(hello.txt)。

该教程解释了两个类的原理,并附加有源码。将源码下载并编译。创建一个你好。txt的文件作为被签名的目标文件,里面随便放点字符串。然后执行:

,美元java  GenSig  hello.txt ,,(生成文件团体和suepk)   美元,java  VerSig  suepk  sig  hello.txt   signature 验证:真正的

在实际使用时,密钥对不可能每次在程序中重新生成。而keytool恰好可以生成并相对安全保存密钥对。所以下面结合了java keytool和实现的功能。

<强>结合keytool与java签名/验证

参考

密钥对由keytool生成并保存到keystore中保护起来(密钥存储库有密码)。公钥也从密钥库中导出.GenSig.java类只需要从密钥库中取得私钥进行签名即可。

VerSig。java也要做适当的修改。貌似因为从密钥库中导出的是证书而不是公钥,两者的封装格式估计有差异。

<强>具体步骤

<李>

利用keytool -genkey生成密钥对保存在密钥存储库中(库文件是examplestanstore)

<李>

利用的keytool -export& # 39;从密钥库中导出公钥证书(StanSmith.cer)

<李>

利用新类GenSig2.java生成签名(文件名是团体),GenSig2.java会从密钥库中取私钥

<李>

将公钥(StanSmith.cer),签名(团体),被签名文件(hello.txt)发给验证方

<李>

验证方利用VerSig2.java进行验证

下面是GenSig2.java和VerSig2.java的源码和执行方式。

GenSig2。java

import  . io . *;   import  java.security。*;      class  GenSig2  {      ,public  static  void  main (String [], args), {      ,if  (args.length  !=, 1), {   System.out.println才能(“用法:,java  GenSig2  & lt; nameOfFileToSign>“);   ,,}   尝试,else  {/*才能create  key  paire  use  keytool:   美元才能,keytool  -genkey  -alias  signLegal  -keystore  examplestanstore  -validity  1800 *///才能,read  keystore 文件   KeyStore 才能;ks =, KeyStore.getInstance (“JKS");   FileInputStream 才能;ksfis =, new  FileInputStream (“examplestanstore");   BufferedInputStream 才能;ksbufin =, new  BufferedInputStream (ksfis);//才能,open  keystore 以及get  private 关键//才能,alias  is  & # 39; signLeal& # 39;,, kpasswd/spasswd  is  & # 39;流浪汉# 39;   ks.load才能(ksbufin,“vagrant" .toCharArray ());   PrivateKey 才能;priv =, (PrivateKey), ks.getKey (“signLegal",,“vagrant" .toCharArray ());/*,才能Create  a  Signature  object 以及initialize  it  with 从而private  key  */Signature 才能;dsa =, Signature.getInstance (“SHA1withDSA",,“SUN");      dsa.initSign才能(priv);/*,才能Update 以及sign 从而data  */FileInputStream 才能;fis =, new  FileInputStream (args [0]);   BufferedInputStream 才能;bufin =, new  BufferedInputStream (fis);   ,,byte [], buffer =, new 字节[1024];   int 才能;兰;   while 才能;(bufin.available (), !=, 0), {   时间=len 才能;bufin.read(缓冲);   dsa.update才能(缓冲,0,,len);   ,,};      bufin.close才能();/*,才能你that  all 从而data 用be  signed  has  been  read ,   ,,generate  a  signature  for  it  */,,byte [], realSig =, dsa.sign ();      ,/*,才能节省,signature 拷贝a  file  */FileOutputStream 才能;sigfos =, new  FileOutputStream (“sig");   sigfos.write才能(realSig);      sigfos.close才能();/*,才能public  key  file 还要export 得到keystore  use  keytool:   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

java结合keytool实现非对称签名和验证的方法