getKey (alias, keyPassword) возвращает нулевое значение для секретного ключа при вызове из отдельного метода - PullRequest
1 голос
/ 30 мая 2020

Я пытаюсь получить сохраненный ключ в хранилище ключей java. Я написал следующий код.

public class clientEncryptionUtility
{

    public static void generateKeyAndStoreOnKeyStore(String _keyStorePassword, String _keyStorePath, String _keyPassword, String keyAlias) throws Exception // take the keystore path, alias, password
    {
        KeyStore keyStore = KeyStore.getInstance("JCEKS");
        char[] keyStorePassword = _keyStorePassword.toCharArray();
        String path = _keyStorePath;
        FileInputStream fis = new FileInputStream(path);
        //load keystore
        keyStore.load(fis, keyStorePassword);
        //Loading the KeyStore object
        KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(keyStorePassword);

        //Generate the symmetric key for encryption
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

        SecureRandom secureRandom = new SecureRandom();

        int keyBitSize = 128;

        keyGenerator.init(keyBitSize, secureRandom);

        SecretKey secretKey = keyGenerator.generateKey();   //Secret encryption key is genereated

        //setting the password for the key stored in keystore
        System.out.println("Algorithm used to generate key : "+secretKey.getAlgorithm()); 

        char[] keyPassword = _keyPassword.toCharArray();

        KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword);

        KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);

        keyStore.setEntry(keyAlias, secretKeyEntry, entryPassword);
        SecretKey newSecretKey = (SecretKey) keyStore.getKey(keyAlias, keyPassword);
        String stringKey = newSecretKey.toString();
        System.out.println("The encryption key at the alias is: " + stringKey);
    }
    public static void getKeyFromKeyStore(String _keyStorePassword, String _keyStorePath, String keyAlias, String _keyPassword) throws Exception
    {
        KeyStore keyStore = KeyStore.getInstance("JCEKS");
        char[] keyStorePassword = _keyStorePassword.toCharArray();
        String path = _keyStorePath;
        FileInputStream fis = new FileInputStream(path);

        //load keystore
        keyStore.load(fis, keyStorePassword);
        char[] keyPassword = _keyPassword.toCharArray();
        SecretKey secretKey = (SecretKey) keyStore.getKey(keyAlias, keyPassword);
        // Key key = keyStore.getKey(keyAlias, keyPassword);
        String stringKey = secretKey.toString();
        System.out.println("The encryption key at the alias is: " + stringKey);

    }
}

-Если я вызываю метод generateKeyAndStoreOnKeyStore (), сохраняю ключ и получаю ключ в той же функции, ключ будет извлечен.

-Однако, если я сделаю то же самое из другого метода getKeyFromKeyStore (), в котором я просто пытаюсь получить ключ по псевдониму из ключевого камня, я получаю исключение nullPointerException.

-Где я ошибаюсь?

1 Ответ

2 голосов
/ 30 мая 2020

К сожалению, из javadocs не ясно, что вы должны вызвать метод KeyStore.store(...), чтобы сохранить изменения в хранилище ключей. Как только generateKeyAndStoreOnKeyStore() завершается, созданный там экземпляр KeyStore выходит из области видимости, и все несохраненные изменения, внесенные в хранилище ключей, исчезают.

Вызов метода KeyStore.store(...) после внесения изменений.

...