Учебники

Криптография Java — Получение ключей

В этой главе мы узнаем, как извлечь ключ из хранилища ключей с помощью Java Cryptography.

Чтобы получить ключ из хранилища ключей, выполните действия, указанные ниже.

Шаг 1: Создать объект KeyStore

Метод getInstance () класса KeyStore пакета java.security принимает строковое значение, представляющее тип хранилища ключей, и возвращает объект KeyStore.

Создайте объект класса KeyStore, используя этот метод, как показано ниже.

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

Шаг 2: Загрузите объект KeyStore

Метод load () класса KeyStore принимает объект FileInputStream, представляющий файл хранилища ключей, и параметр String, указывающий пароль хранилища ключей.

Как правило, хранилище ключей хранится в файле 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

Создайте объект SecretKey (interface) путем создания экземпляра его подкласса SecretKeySpec . При создании экземпляра вам необходимо передать пароль и алгоритм в качестве параметров его конструктору, как показано ниже.

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

Шаг 5: Создайте объект SecretKeyEntry

Создайте объект класса SecretKeyEntry , передав объект SecretKey, созданный на предыдущем шаге, как показано ниже.

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

Шаг 6: установить запись в хранилище ключей

Метод setEntry () класса KeyStore принимает параметр String, представляющий псевдоним записи хранилища ключей, объект SecretKeyEntry, объект ProtectionParameter и сохраняет запись под указанным псевдонимом.

Установите запись в хранилище ключей, используя метод setEntry (), как показано ниже.

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Шаг 7: Создайте объект KeyStore.SecretKeyEntry

Метод getEntry () класса KeyStore принимает псевдоним (параметр String) и объект класса ProtectionParameter в качестве параметров и возвращает объект KeyStoreEntry, после чего его можно преобразовать в объект KeyStore.SecretKeyEntry .

Создайте объект класса KeyStore.SecretKeyEntry, передав псевдоним требуемого ключа и объект параметра защиты, созданный на предыдущих шагах, в метод getEntry (), как показано ниже.

//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

Шаг 8: Создайте ключевой объект для извлеченной записи

Метод getSecretKey () класса SecretKeyEntry возвращает объект 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());
   }
}

Выход

Вышеуказанная программа генерирует следующий вывод —