Как сохранить простую строку ключей внутри Java KeyStore? - PullRequest
7 голосов
/ 05 июня 2011

У меня есть файл на моей FS (ключ S3 AWS), который содержит строку, которая является ключом, который я использую для процесса шифрования.

Я бы хотел переместить его в хранилище ключей Java.

Я знаю, как импортировать сертификат в KeyStore с помощью keytool, но не могу найти способ импорта простого строкового ключа.

Можешь помочь?

Ответы [ 4 ]

12 голосов
/ 11 августа 2014

Вы можете сделать это с PBE и JCEKS. Я не думаю, что вы можете сделать это с JKS. Решение:

Создание хранилища ключей для хранения и получения записей от:

keytool -keystore clientkeystore -genkey -alias client -storetype jceks

Теперь немного кода, чтобы проверить это.

   public static String getPasswordFromKeystore(String entry, String keystoreLocation, String keyStorePassword) throws Exception{

        KeyStore ks = KeyStore.getInstance("JCEKS");
        ks.load(null, keyStorePassword.toCharArray());
        KeyStore.PasswordProtection keyStorePP = new KeyStore.PasswordProtection(keyStorePassword.toCharArray());

        FileInputStream fIn = new FileInputStream(keystoreLocation);

        ks.load(fIn, keyStorePassword.toCharArray());

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBE");

        KeyStore.SecretKeyEntry ske =
                (KeyStore.SecretKeyEntry)ks.getEntry(entry, keyStorePP);

        PBEKeySpec keySpec = (PBEKeySpec)factory.getKeySpec(
                ske.getSecretKey(),
                PBEKeySpec.class);

        char[] password = keySpec.getPassword();

        return new String(password);

    }

    public static void makeNewKeystoreEntry(String entry, String entryPassword, String keyStoreLocation, String keyStorePassword)
            throws Exception {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBE");
        SecretKey generatedSecret =
                factory.generateSecret(new PBEKeySpec(
                        entryPassword.toCharArray()));

        KeyStore ks = KeyStore.getInstance("JCEKS");
        ks.load(null, keyStorePassword.toCharArray());
        KeyStore.PasswordProtection keyStorePP = new KeyStore.PasswordProtection(keyStorePassword.toCharArray());

        ks.setEntry(entry, new KeyStore.SecretKeyEntry(
                generatedSecret), keyStorePP);

        FileOutputStream fos = new java.io.FileOutputStream(keyStoreLocation);
        ks.store(fos, keyStorePassword.toCharArray());
    }
3 голосов
/ 05 июня 2011

Я не вижу способа сделать это с помощью keytool, но некоторые возятся, интересно, если бы вы могли сохранить и извлечь его в коде как SecretBey PasswordBasedEncryption (PBE).(Отказ от ответственности: я не пробовал это сам).

Ресурсы, которые привели эту мысль: PBEKeySpec javadoc и CryptoSpec - Пример использования шифрования на основе пароля

2 голосов
/ 16 февраля 2019

Я знаю, что это старо;но я сталкивался с тем же случаем использования.

https://docs.oracle.com/javase/9/tools/keytool.htm#JSWOR-GUID-5990A2E4-78E3-47B7-AE75-6D1826259549

хранилища ключей имеют опции importpass, в которых хранится KeyStore.SecretKeyEntry, идентифицируемый псевдонимом.может хранить вашу строку в псевдониме.

0 голосов
/ 05 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...