在本章中,我们将学习如何使用Java Cryptography从密钥库中检索密钥.
要从密钥库中检索密钥,请按照以下步骤进行操作.
步骤1:创建KeyStore对象
KeyStore 类的 getInstance()方法 java.security 包接受表示密钥库类型的字符串值,并返回KeyStore对象.
使用此方法创建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);
步骤7:创建KeyStore.SecretKeyEntry对象
getEntry()方法KeyStore类接受别名(String参数),并将ProtectionParameter类的对象作为参数并返回 KeyStoreEntry 对象,然后将其转换为 KeyStore.SecretKeyEntry 对象.
通过将前面步骤中创建的必需键和保护参数对象的别名传递给 getEntry()方法如下所示.
//创建KeyStore.SecretKeyEntry对象 KeyStore.SecretKeyEntry secretKeyEnt =(KeyStore.SecretKeyEntry) keyStore.getEntry("secretKeyAlias",protectionParam);
步骤8:创建检索条目的关键对象
getSecretKey() SecretKeyEntry 类的方法返回一个SecretKey对象.使用此方法创建一个SecretKey对象,如下所示.
//创建SecretKey对象 SecretKey mysecretKey = secretKeyEnt.getSecretKey(); System.out.println(mysecretKey);
示例
以下示例显示如何从密钥库中检索密钥.在这里,我们将密钥存储在密钥库中,该密钥库位于"cacerts"文件(Windows 10操作系统)中,检索它,并显示它的一些属性,例如用于生成密钥的算法,以及格式检索到的密钥.
import java.io.FileInputStream;import java.security.KeyStore;import java.security.KeyStore.ProtectionParameter;import java.security.KeyStore.SecretKeyEntry;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class RetrievingFromKeyStore{ public static void main(String args[]) throws Exception{ //Creating the KeyStore object KeyStore keyStore = KeyStore.getInstance("JCEKS"); //Loading the the KeyStore object char[] password = "changeit".toCharArray(); java.io.FileInputStream fis = new FileInputStream( "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts"); keyStore.load(fis, password); //Creating the KeyStore.ProtectionParameter object ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password); //Creating SecretKey object SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA"); //Creating SecretKeyEntry object SecretKeyEntry secretKeyEntry = new 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); //Creating the KeyStore.SecretKeyEntry object SecretKeyEntry secretKeyEnt = (SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam); //Creating SecretKey object SecretKey mysecretKey = secretKeyEnt.getSecretKey(); System.out.println("Algorithm used to generate key : "+mysecretKey.getAlgorithm()); System.out.println("Format used for the key: "+mysecretKey.getFormat()); }}
输出
上述程序生成以下输出 :
Algorithm used to generate key: DSAFormat of the key: RAW