Android KeyStore - Как сохранить RSA PrivateKey

Я получаю из веб-службы (сделанной мною) RSA PrivateKey PKCS # 8, закодированной в базе 64 String. Мое приложение для Android должно безопасно сохранять этот ключ где-то в телефоне.

Из версии 4.3 для Android можно сохранить ключи с помощью нового KeyStore API. Я нашел статью с кодом axample, которая показывает, как создать KeyPair с Спецификацией, необходимой для хранения ключей. И после того, как восстановить ключи.

// generate a key pair
Context ctx = getContext();
Calendar notBefore = Calendar.getInstance()
Calendar notAfter = Calendar.getInstance();
notAfter.add(1, Calendar.YEAR);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx)
            .setAlias("key1")
            .setSubject(
                    new X500Principal(String.format("CN=%s, OU=%s", alais,
                            ctx.getPackageName())))
            .setSerialNumber(BigInteger.ONE).setStartDate(notBefore.getTime())
            .setEndDate(notAfter.getTime()).build();

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpGenerator.initialize(spec);
KeyPair kp = kpGenerator.generateKeyPair();

// in another part of the app, access the keys
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("key1", null);
RSAPublicKey pubKey = (RSAPublicKey)keyEntry.getCertificate().getPublicKey();
RSAPrivateKey privKey = (RSAPrivateKey) keyEntry.getPrivateKey();

Но я не понимаю, как сохранить существующий ключ. Кто-нибудь может мне помочь? Спасибо заранее

Ответы

Ответ 1

В KeyStore личные ключи должны храниться вместе с сертификатом (даже поддельным самозаверяющим сертификатом). Чтобы сохранить ваш ключ в AndroidKeyStore, выполните следующие действия:

  • расшифруйте Base64 PKCS # 8, чтобы получить экземпляр PrivateKey
  • веб-служба отправляет сертификат (или цепочку сертификатов) вместе с закрытым ключом или блоком PKCS # 8 также содержит открытый ключ.
  • При необходимости вам нужно сгенерировать сертификат для закрытого ключа. Библиотека BouncyCastle может сделать это (образец кода можно найти здесь).

Теперь вы можете добавить свой ключ в хранилище ключей.

PrivateKey myKey = getKey();
X509Certificate certificate = getCertificate();
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
keystore.setKeyEntry("anAlias", myKey, null, new Certificate[] { certificate });