
- Java 密碼學教程
- Java 密碼學 - 首頁
- Java 密碼學 - 簡介
- 訊息摘要和 MAC
- Java 密碼學 - 訊息摘要
- Java 密碼學 - 建立 MAC
- Java 密碼學資源
- Java 密碼學 - 快速指南
- Java 密碼學 - 資源
- Java 密碼學 - 討論
Java 密碼學 - 金鑰檢索
本章將學習如何使用 Java 密碼學從金鑰庫中檢索金鑰。
要從金鑰庫中檢索金鑰,請按照以下步驟操作。
步驟 1:建立 KeyStore 物件
java.security 包中的 KeyStore 類的 getInstance() 方法接受一個表示金鑰庫型別的字串值,並返回一個 KeyStore 物件。
使用此方法建立 KeyStore 類的物件,如下所示。
//Creating the KeyStore object KeyStore keyStore = KeyStore.getInstance("JCEKS");
步驟 2:載入 KeyStore 物件
KeyStore 類的 load() 方法接受一個表示金鑰庫檔案的 FileInputStream 物件和一個指定 KeyStore 密碼的 String 引數。
通常,KeyStore 儲存在名為 cacerts 的檔案中,位置為 C:/Program Files/Java/jre1.8.0_101/lib/security/,其預設密碼為 changeit,使用 load() 方法載入它,如下所示。
//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);
步驟 3:建立 KeyStore.ProtectionParameter 物件
如下所示例項化 KeyStore.ProtectionParameter。
//Creating the KeyStore.ProtectionParameter object KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);
步驟 4:建立 SecretKey 物件
透過例項化其子類 SecretKeySpec 來建立 SecretKey(介面)物件。例項化時,需要將密碼和演算法作為引數傳遞給其建構函式,如下所示。
//Creating SecretKey object SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");
步驟 5:建立 SecretKeyEntry 物件
透過將上面步驟中建立的 SecretKey 物件作為引數,建立 SecretKeyEntry 類的物件,如下所示。
//Creating SecretKeyEntry object KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
步驟 6:將條目設定到 KeyStore
KeyStore 類的 setEntry() 方法接受一個表示金鑰庫條目別名的 String 引數、一個 SecretKeyEntry 物件和一個 ProtectionParameter 物件,並將條目儲存在給定的別名下。
使用 setEntry() 方法將條目設定到金鑰庫,如下所示。
//Set the entry to the keystore keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);
步驟 7:建立 KeyStore.SecretKeyEntry 物件
KeyStore 類的 getEntry() 方法接受一個別名(String 引數)和一個 ProtectionParameter 類的物件作為引數,並返回一個 KeyStoreEntry 物件,然後可以將其強制轉換為 KeyStore.SecretKeyEntry 物件。
透過將所需金鑰的別名和前面步驟中建立的 protection parameter 物件作為引數傳遞給 getEntry() 方法,建立 KeyStore.SecretKeyEntry 類的物件,如下所示。
//Creating the KeyStore.SecretKeyEntry object KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);
步驟 8:建立檢索條目的金鑰物件
SecretKeyEntry 類的 getSecretKey() 方法返回一個 SecretKey 物件。使用此方法建立 SecretKey 物件,如下所示。
//Creating SecretKey object 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: DSA Format of the key: RAW