Я хочу использовать AndroidKeyStore, чтобы сохранить пару ключей RSA только на устройстве Samsung с Lollipop. Я знаю, что в реализации Android по умолчанию есть ошибка (https://code.google.com/p/android/issues/detail?id=61989), но кажется, что на устройствах Samsung Lollipop это исправлено. Но я вижу еще два странных поведения. Пара ключей RSA создается с помощью следующего кода:
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx)
.setAlias(ALIAS)
.setSubject(
new X500Principal(String.format("CN=%s, OU=%s", ALIAS,
ctx.getPackageName())))
.setSerialNumber(BigInteger.ONE).setStartDate(notBefore.getTime())
.setEndDate(notAfter.getTime()).build();
KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpGenerator.initialize(spec);
kpGenerator.generateKeyPair();
И это код, который открывает KeyStore
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(ALIAS, null);
if (keyEntry != null) {
return (RSAPrivateKey) keyEntry.getPrivateKey();
}
Проблема № 1: на эмуляторе Android и на устройстве CyanogenMod 12.1 хранилище ключей разблокируется при загрузке устройства, ДАЖЕ ЕСЛИ пользователь не вставил PIN-код-ПАРОЛЬ-ШАБЛОН разблокировки, и мое тестовое приложение может получить доступ к хранилищу ключей. Вместо этого на устройствах Samsung хранилище ключей заблокировано до тех пор, пока пользователь не отключит блокировку клавиатуры в первый раз. Ключ должен быть зашифрован с помощью ключа AES, полученного из PIN-кода или ПАРОЛЯ, и без вмешательства пользователя хранилище ключей должно быть заблокировано.
Проблема № 2: на всех устройствах можно вставить пару ключей, даже если не включен безопасный экран блокировки, без каких-либо предупреждений ОС типа «Вы должны настроить метод блокировки экрана». Как и выше, ключ должен быть зашифрован, и без блокировки экрана это может быть невозможно сделать.
Что не так с моим кодом?