Какие реализации KeyStore можно использовать для хранения симметричных ключей?

java.security.KeyStore использует KeyStoreSpi реализации для предоставления хранилищ ключей разных типов. Базовый OpenJDK поставляется с поддержкой типов хранилищ ключей JKS, JCEKS и PKCS12. Первые два реализуют проприетарный формат Sun/Oracle, а PKCS12 является общедоступным стандартом.

Я знаю, что JCEKS поддерживает симметричные ключи, а PKCS12 — нет. Какие другие реализации KeyStoreSpi (например, Bouncy Castle) обеспечивают поддержку симметричных ключей? Похоже, разработчики любят скрывать такую ​​информацию. Например. В документах Bouncy Castle упоминается только:

Четвертым является хранилище ключей BCFKS, которое является хранилищем ключей, совместимым с FIPS, которое также предназначено для общего хранения ключей и основано на ASN.1. Этот тип хранилища ключей зашифрован и поддерживает использование SCRYPT и хранение некоторых типов симметричных ключей.


person Evan    schedule 04.11.2020    source источник


Ответы (1)


Как вы думаете, почему хранилище ключей PKCS#12 вообще не сохраняет секретные ключи? Я работаю над Desktop OpenJDK 11.x, и у меня нет проблем с сохранением и перезагрузкой секретного ключа с помощью хранилища ключей PKCS # 12.

Но вы правы — в некоторых реализациях Java это не работает — просто попробуйте!

выход:

Keystore Type PKCS12
source: https://www.pixelstech.net/article/1420427307-Different-types-of-keystore-in-Java----PKCS12
create a keystore
load the keystore and store a secret key
key after generation length: 32 data: eb6b8efafcee46880ea75b83754442efe4ee9d66ce755698cc803fd7775e4e78
load secret key from keystore
key after loading    length: 32 data: eb6b8efafcee46880ea75b83754442efe4ee9d66ce755698cc803fd7775e4e78

Предупреждение системы безопасности: код не имеет обработки исключений и предназначен только для образовательных целей.

код:

import javax.crypto.KeyGenerator;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;

public class KeystoreTypePKCS12 {
    public static void main(String[] args) {
        System.out.println("Keystore Type PKCS12");
        // https://stackoverflow.com/questions/64677544/which-keystore-implementations-can-be-used-for-storing-symmetric-keys
        System.out.println("source: https://www.pixelstech.net/article/1420427307-Different-types-of-keystore-in-Java----PKCS12");

        System.out.println("create a keystore");
        try {
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            keyStore.load(null, null);
            keyStore.store(new FileOutputStream("keystore.p12"), "password".toCharArray());
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        System.out.println("load the keystore and store a secret key");
        try {
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            keyStore.load(new FileInputStream("keystore.p12"), "password".toCharArray());
            // generate an aes secret key
            KeyGenerator keyGen = KeyGenerator.getInstance("AES");
            keyGen.init(256);
            Key key = keyGen.generateKey();
            System.out.println("key after generation length: " + key.getEncoded().length
                    + " data: " + bytesToHex(key.getEncoded()));
            // store it in the keystore
            keyStore.setKeyEntry("secret", key, "password".toCharArray(), null);
            // save the keystore
            keyStore.store(new FileOutputStream("keystore.p12"), "password".toCharArray());
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        System.out.println("load secret key from keystore");
        try{
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            keyStore.load(new FileInputStream("keystore.p12"), "password".toCharArray());
            Key keyLoad = keyStore.getKey("secret", "password".toCharArray());
            System.out.println("key after loading    length: " + keyLoad.getEncoded().length
                    + " data: " + bytesToHex(keyLoad.getEncoded()));
        } catch (Exception ex){
            ex.printStackTrace();
        }

    }
    private static String bytesToHex(byte[] bytes) {
        StringBuffer result = new StringBuffer();
        for (byte b : bytes) result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
        return result.toString();
    }
}
person Michael Fehr    schedule 04.11.2020
comment
Интересно, я провел несколько модульных тестов, и оказалось, что вы правы, и PKCS12 может хранить как минимум ключи AES. Я использую ChaCha20, и PKCS12 не работает с Key protection algorithm not found: unrecognized algorithm name: ChaCha20. Напротив, JCEKS может хранить ключи AES и ChaCha20. Тем не менее, симметричный ключ - это просто массив байтов, не понимаю, почему хранилища ключей должны быть такими привередливыми. - person Evan; 04.11.2020
comment
Я рад прочитать, что ваши тесты прошли успешно. Не могли бы вы пометить мой ответ как принятый - спасибо? - person Michael Fehr; 06.11.2020