Используемые / генерируемые ключи и сертификаты хранятся в базе данных, называемой хранилищем ключей. По умолчанию эта база данных хранится в файле с именем .keystore .
Вы можете получить доступ к содержимому этой базы данных, используя класс KeyStore пакета java.security . Это управляет тремя различными записями, а именно: PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.
- PrivateKeyEntry
- SecretKeyEntry
- TrustedCertificateEntry
Хранение ключа в хранилище ключей
В этом разделе мы узнаем, как хранить ключ в хранилище ключей. Чтобы сохранить ключ в хранилище ключей, выполните следующие действия.
Шаг 1: Создать объект KeyStore
Метод getInstance () класса KeyStore пакета java.security принимает строковое значение, представляющее тип хранилища ключей, и возвращает объект 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 (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);
пример
В следующем примере ключи хранятся в хранилище ключей, существующем в файле «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"); } }
Выход
Вышеуказанная программа генерирует следующий вывод —