2015-06-30 4 views
0

Я хочу использовать AndroidKeyStore, чтобы сохранить пару ключей RSA только на устройстве Samsung с Lollipop. Я знаю, что по умолчанию у android-реализации есть ошибка (https://code.google.com/p/android/issues/detail?id=61989), но кажется, что на устройствах Samsung Lollipop это исправлено. Но я вижу еще два странных поведения. ЭОС пара ключей создается с помощью следующего кода:AndroidKeyStore странное поведение

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.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(ALIAS, null); 

if (keyEntry != null) { 
    return (RSAPrivateKey) keyEntry.getPrivateKey(); 
} 

Issue N.1: на Android эмулятора и на CyanogenMod 12.1 устройства к хранилищу разблокируется при загрузке устройства. ДАЖЕ ЕСЛИ пользователь не вставил разблокировку PIN-PASSWORD-PATTERN, и мое тестовое приложение может получить доступ к хранилищу ключей. На устройствах Samsung вместо хранилища ключей заблокировано до тех пор, пока пользователь не отпустит блокировку клавиатуры в первый раз. Ключ должен быть зашифрован с использованием ключа AES, полученного из PIN-кода или PASSWORD, и без взаимодействия пользователя хранилище ключей должно быть заблокировано

Проблема n.2: на всех устройствах можно вставить пару ключей, даже если экран защищенной блокировки не включен , без какого-либо предупреждения, например: «Вы должны настроить метод блокировки экрана» операционной системой. Как и выше, ключ должен быть зашифрован и без блокировки экрана может быть невозможно сделать это.

Что случилось с моим кодом?

+0

Какие устройства являются «всеми устройствами» (версия устройства и ОС)? Включено ли устройство Samsung KNOX? – Robert

+0

С «всеми устройствами» я имею в виду все устройства Samsung с Lollipop + некоторые Samsung с kk + LG с Lollipop + симулятор с леденцом. Knox никогда не включался – Sarbyn

ответ

0

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

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

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^