Странное поведение AndroidKeyStore

Я хочу использовать 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: на всех устройствах можно вставить пару ключей, даже если не включен безопасный экран блокировки, без каких-либо предупреждений ОС типа «Вы должны настроить метод блокировки экрана». Как и выше, ключ должен быть зашифрован, и без блокировки экрана это может быть невозможно сделать.

Что не так с моим кодом?


person Sarbyn    schedule 30.06.2015    source источник
comment
К каким устройствам относятся все устройства (устройство и версия ОС)? Включен ли KNOX на устройстве Samsung?   -  person Robert    schedule 30.06.2015
comment
Под всеми устройствами я подразумеваю все устройства Samsung с леденцом + некоторые самсунги с kk + LG с леденцом + симулятор с леденцом. Knox никогда не включался   -  person Sarbyn    schedule 30.06.2015


Ответы (1)


@nikolay-elenkov предлагает мне использовать KeyPairGeneratorSpec.Builder.setEncryptionRequired() для шифрования ключей при тестировании, и теперь ВСЕ устройства запрашивают безопасную блокировку экрана при создании пары ключей, а во время загрузки хранилище ключей блокируется до тех пор, пока пользователь не введет пин-код. -Пароль-Шаблон. Сейчас все хорошо! Как всегда спасибо @nikolay-elenkov

Интересно, что на устройствах Samsung с Lollipop и включенной безопасной блокировкой экрана шифрование включено по умолчанию без использования setEncryptionRequired. Вот почему я вижу странное поведение в «Выпуске № 1» ... как обычно, «странная» настройка Samsung.

person Sarbyn    schedule 02.07.2015
comment
setEncryptionRequired работает только на устройстве LOLLIPOP. На старых устройствах (note3 neo с android 4.4.2 и S4 mini с 4.4.2) всплывающее окно с вводом пароля для хранилища учетных данных (какой пароль????) отображается при загрузке пары ключей в KeyStore и отсутствии блокировки экрана. выставиться. Но это не имеет значения из-за ошибки KitKat (code.google.com/ p/android/issues/detail?id=61989), и мое решение будет доступно только для Android › 5.0 - person Sarbyn; 02.07.2015