Не удается сериализовать AndroidKeyStore в OutputStream - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь сохранить объект Android KeyStore в файл, чтобы позже использовать сгенерированный закрытый ключ.Мне нужно сделать это, потому что после выхода из приложения закрытый ключ стирается.Для этого я записываю KeyStore объект в выходной поток согласно этому и этому примеру.Однако, когда я пытаюсь это сделать, я получаю следующую ошибку:

java.lang.UnsupportedOperationException: не удается сериализовать AndroidKeyStore в OutputStream

Это происходит в mKeyStore.store(keyStoreOutputStream, keyStorePassword);

mKeyStore = KeyStore.getInstance("AndroidKeyStore");
mSignature = Signature.getInstance("SHA256withECDSA");
mKeyStore.load(null);

// Generate private key
PrivateKey key = (PrivateKey) mKeyStore.getKey(KEY_NAME, null);
Certificate [] cert = mKeyStore.getCertificateChain(KEY_NAME);
char[] keyStorePassword = null;

// Store private key into mKeyStore
mKeyStore.setKeyEntry(KEY_NAME, key, null, cert);

// Save mKeyStore to outputstream
String filepath = activity.getFilesDir().getPath().toString() + "/keystore.ks";
try (FileOutputStream keyStoreOutputStream = new FileOutputStream(filepath)) {
    mKeyStore.store(keyStoreOutputStream, keyStorePassword);
}

mSignature.initSign(key);

Это лучший способ сохранить мой KeyStore объект для последующего использования?Если да, то как мне исправить ошибку Can not serialize AndroidKeyStore to OutputStream?

Спасибо.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Android KeyStore - это не то же самое, что AndroidKeyStore.

AndroidKeyStore - это компонент Android, который можно использовать для безопасного создания и хранения ключей.См. https://developer.android.com/training/articles/keystore

Система Android Keystore позволяет хранить криптографические ключи в контейнере, чтобы его было сложнее извлечь из устройства.Как только ключи находятся в хранилище ключей, они могут использоваться для криптографических операций, при этом материал ключа остается неэкспортируемым.

Ключи являются постоянными.Любой ключ, сгенерированный в AndroidKeyStore, будет присутствовать после перезапуска приложения.Это рекомендуемый способ хранения ключей

Обратите внимание, что ключи не извлекаются.Если вам нужно каким-то образом экспортировать закрытый ключ, вам нужно будет использовать стандартный файл хранилища ключей, а не AndroidKeystore

0 голосов
/ 15 марта 2019

KeyStore.getInstance("AndroidKeyStore"); возвращает объект AndroidKeyStore.Вы можете видеть здесь , что в более старых версиях Android AndroidKeyStore.store просто выдает исключение, о котором вы говорите.

@Override
public void engineStore(OutputStream stream, char[] password) throws IOException,
        NoSuchAlgorithmException, CertificateException {
    throw new UnsupportedOperationException("Can not serialize AndroidKeyStore to OutputStream");
}

Я рекомендую просто использовать KeyStore.getInstance(KeyStore.getDefaultType())

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