Я пытаюсь настроить зашифрованный экземпляр области по умолчанию в своем приложении. Идея состоит в том, чтобы сгенерировать ключ с помощью KeyPairGenerator с заданным псевдонимом, сохранить его в AndroidKeyStore и использовать указанный ключ каждый раз, когда он необходим.
ЧТО Я ДЕЛАЮ
Вот как я генерирую ключ:
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
if (!ks.containsAlias(KEY_ALIAS)) {
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.add(Calendar.YEAR, 99);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this)
.setAlias(KEY_ALIAS)
.setSubject(new X500Principal("CN=Example, O=ExampleOrg"))
.setSerialNumber(BigInteger.ONE)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
generator.initialize(spec);
KeyPair keyPair = generator.generateKeyPair();
}
Я использую KeyPairGenerator, так как мне нужно поддерживать API версии 18 и выше.
Вот как я настраиваю свой экземпляр области по умолчанию в своем приложении:
RealmConfiguration config = null;
try {
config = new RealmConfiguration
.Builder(this)
.encryptionKey(ks.getKey(KEY_ALIAS, null).getEncoded())
.name("dealmatrix.realm")
.schemaVersion(1)
.build();
где ks — это экземпляр хранилища ключей, полученный следующим образом:
Keystore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
ЧТО ИДУТ НЕ ТАК
Моя проблема в том, что это выражение:
ks.getKey(KEY_ALIAS, null).getEncoded()
возвращает null, что по понятным причинам приводит к исключению.
Я читал в Интернете, что это предполагаемое поведение системы KeyStore.
Если я действительно не могу получить массив байтов сохраненного ключа шифрования, как я должен зашифровать свою область с помощью указанного ключа?
Существуют ли какие-либо другие способы безопасного хранения ключа шифрования, чтобы я мог использовать его в своей конфигурации области?