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
廣告