Криптография Java - Хранение ключей

Используемые / созданные ключи и сертификаты хранятся в базе данных, называемой хранилищем ключей. По умолчанию эта база данных хранится в файле с именем.keystore.

Вы можете получить доступ к содержимому этой базы данных, используя KeyStore класс java.securityпакет. Он управляет тремя разными записями, а именно: PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

Хранение ключа в хранилище ключей

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

Шаг 1. Создайте объект KeyStore

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

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

//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 (интерфейс) объект, создав его подкласс 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 object, объект ProtectionParameter и сохраняет запись под заданным псевдонимом.

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

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

Example

В следующем примере ключи хранятся в хранилище ключей, существующем в файле «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");
   }
}

Output

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

System.out.println("data stored");