参考”Oracle–The Java Tutorials: Generate Keys”
尚有姊妹篇:Java团结keytool实现非对称加密息争密
keytool的利用
keytool 是 JDK 自带的一个密钥库打点东西。这里只用到了 keytool 的部门成果,包罗生成密钥对、导出公钥等。keytool 生成的公钥/私钥对存放到一个到了一个文件中,这个文件有暗码掩护,通称为 keystore。
$ 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 类生成密钥对,对输入的文件举办签名,输出了一个签名功效文件 sig 和公钥 suepk。
VerSig.java 类接管三个参数:公钥文件名(suepk)、签名文件(sig)、被签名的源文件名(hello.txt)。
该教程表明白两个类的道理,并附加有源码。将源码下载并编译。建设一个 hello.txt 的文件作为被签名的方针文件,昆山软件开发,内里随便放点字符串。然后执行:
$ java GenSig hello.txt (生成文件sig和suepk) $ java VerSig suepk sig hello.txt signature verifies: true
在实际利用时,密钥对不行能每次在措施中从头生成。而 keytool 刚好可以生成并相对安详生存密钥对。所以下面团结了 keytool 和 Java 实现的成果。
团结keytool与Java签名/验证
参考”Oracle–The Java Tutorials: Weaknesses and Alternatives”
密钥对由 keytool 生成并生存到 keystore 中掩护起来(keystore有暗码)。公钥也从 keystore 中导出。GenSig.java 类只需要从 keystore 中取得私钥举办签名即可。
VerSig.java 也要做适当的修改。貌似因为从 keystore 中导出的是证书而不是公钥,两者的封装名目预计有差别。
keytool -genkey 生成密钥对生存在 keystore 中(库文件是examplestanstore);下面是 GenSig2.java 和 VerSig2.java 的源码和执行方法。
GenSig2.java
import java.io.*;
import java.security.*;
class GenSig2 {
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("Usage: java GenSig2 <nameOfFileToSign>");
}
else try{
/*create key paire use keytool:
$ keytool -genkey -alias signLegal -keystore examplestanstore -validity 1800*/
// read keystore file
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream ksfis = new FileInputStream("examplestanstore");
BufferedInputStream ksbufin = new BufferedInputStream(ksfis);
// open keystore and get private key
// alias is 'signLeal', kpasswd/spasswd is 'vagrant'
ks.load(ksbufin, "vagrant".toCharArray());
PrivateKey priv = (PrivateKey) ks.getKey("signLegal", "vagrant".toCharArray());
/* Create a Signature object and initialize it with the private key */
Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
dsa.initSign(priv);
/* Update and sign the data */
FileInputStream fis = new FileInputStream(args[0]);
BufferedInputStream bufin = new BufferedInputStream(fis);
byte[] buffer = new byte[1024];
int len;
while (bufin.available() != 0) {
len = bufin.read(buffer);
dsa.update(buffer, 0, len);
};
bufin.close();
/* Now that all the data to be signed has been read in,
generate a signature for it */
byte[] realSig = dsa.sign();
/* Save the signature in a file */
FileOutputStream sigfos = new FileOutputStream("sig");
sigfos.write(realSig);
sigfos.close();
/* public key file can export from keystore use keytool:
$ keytool -export -keystore examplestanstore -alias signLegal -file StanSmith.cer */
} catch (Exception e) {
System.err.println("Caught exception " + e.toString());
}
};
编译后,这样运行:
$ java GenSig2 hello.txt