使用/生成的密钥和证书存储在称为密钥库的数据库中.默认情况下,此数据库存储在名为 .keystore 的文件中.
您可以使用 KeyStore 类访问此数据库的内容 java.security 包的内容.这管理三个不同的条目,即PrivateKeyEntry,SecretKeyEntry,TrustedCertificateEntry.
PrivateKeyEntry
SecretKeyEntry
TrustedCertificateEntry
在密钥库中存储密钥
在本节中,我们将学习如何在密钥库中存储密钥.要在密钥库中存储密钥,请按照以下步骤操作.
步骤1:创建KeyStore对象
getInstance() java.security 包的 KeyStore 类的方法接受表示密钥库类型的字符串值,并返回KeyStore对象.
使用 getInstance()方法创建KeyStore类的对象,如下所示.
//创建KeyStore对象 KeyStore keyStore = KeyStore.getInstance("JCEKS");
第2步:加载KeyStore对象
load()方法KeyStore类接受表示密钥库文件的FileInputStream对象和指定KeyStore密码的String参数.
通常,KeyStore存储在名为 cacerts ,在 C:/Program Files/Java/jre1.8.0_101/lib/security/位置,其默认密码为 changeit ,使用加载load()方法如下所示.
//Loading the KeyStore objectchar[] password = "changeit".toCharArray();String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";java.io.FileInputStream fis = new FileInputStream(path);keyStore.load(fis, password);
步骤3:创建KeyStore.ProtectionParameter对象
实例化KeyStore.ProtectionParameter,如下所示.
//创建KeyStore.ProtectionParameter对象 KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
步骤4:创建一个SecretKey对象
创建 SecretKey (接口)对象通过实例化其Sub类 SecretKeySpec .在实例化时,你需要将密码和算法作为参数传递给它的构造函数,如下所示.
//创建SecretKey对象 SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(),"DSA");
步骤5:创建SecretKeyEntry对象
创建 SecretKeyEntry 类的对象通过传递在上面步骤中创建的 SecretKey 对象,如下所示.
//创建SecretKeyEntry对象 KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
步骤6:设置KeyStore的条目
setEntry()方法 KeyStore 类接受表示密钥库条目别名的String参数, SecretKeyEntry 对象,ProtectionParameter对象,并将条目存储在给定别名下.
使用 setEntry()方法设置密钥库的条目,如下所示.
//将条目设置为密钥库 keyStore.setEntry("secretKeyAlias",secretKeyEntry,protectionParam);
示例
以下示例将密钥存储到"cacerts"中存在的密钥库中"文件(Windows 10操作系统).
import java.io.FileInputStream;import java.security.KeyStore;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class StoringIntoKeyStore{ public static void main(String args[]) throws Exception { //Creating the KeyStore object KeyStore keyStore = KeyStore.getInstance("JCEKS"); //Loading the KeyStore object char[] password = "changeit".toCharArray(); String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts"; java.io.FileInputStream fis = new FileInputStream(path); keyStore.load(fis, password); //Creating the KeyStore.ProtectionParameter object KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password); //Creating SecretKey object SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA"); //Creating SecretKeyEntry object KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey); keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam); //Storing the KeyStore object java.io.FileOutputStream fos = null; fos = new java.io.FileOutputStream("newKeyStoreName"); keyStore.store(fos, password); System.out.println("data stored"); }}
输出
以上程序生成以下输出 :
System.out.println("data stored");