Android Keystore, безопасное значение ключа

Я изучаю, используя безопасный / улучшенный Keystore, представленный в Android 4.3.

Я хотел бы сохранить ключ шифрования внутри этого хранилища ключей, этот ключ используется для шифрования sqlite db и значений, содержащихся в моих общих предпочтениях.

Когда я рассмотрю образец KeyStore в SDK, я вижу следующее:

public static final String ALIAS = "my_key" 

Если кто-то сможет декомпилировать мой код, они смогут увидеть псевдоним cleartext (= ключ для извлечения ключа шифрования из хранилища ключей), и, следовательно, они смогут получить ссылку на мой ключ шифрования. Как я могу безопасно управлять своим ALIAS? Или я пропустил здесь пункт?

Псевдоним не является конфиденциальной информацией. Каждое хранилище ключей связано с паролем, и каждый ключ имеет свой (дополнительный) пароль. Это ценности, которые должны быть сохранены.

Без пароля (ов) злоумышленник не может прочитать ваш ключевой материал, несмотря на знание псевдонима.

Ниже приведен ответ на 4.3+. В этом выпуске были внесены большие изменения в классы KeyStore & KeyChain. См. Здесь для получения дополнительной информации

Keystore к Keystore ограничен UID – вашему приложению выделяется UID при установке.

Это то, что предотвращает доступ других приложений / процессов к вашему ключу пары / закрытому ключу . Деймонд-хранилище ключей обеспечит это.

Это может потребовать от устройства дополнительную шину. См. http://developer.android.com/reference/android/security/KeyPairGeneratorSpec.Builder.html#setEncryptionRequired ()

Весь смысл использования программного обеспечения / аппаратного хранилища ключей состоит в том, чтобы обойти ситуацию, которую вы описываете, – какие-либо жестко запрограммированные данные в вашем приложении можно прочитать при декомпиляции, чтобы она не была безопасной.

@Duncans отвечает, что вам кажется, что вам нужно поддерживать пароль. Я бы посоветовал вам создать пару ключей, используя хранилище ключей, а затем использовать это для шифрования ключа AES, который вы можете использовать для шифрования всего, что вы хотите (гораздо быстрее, чем использование ключа RSA)

Вы можете использовать секретный ключ, поддерживаемый хранилищем оборудования / сортировки, как keyStore.getEntry(alias, null); И не передавать какой-либо пароль.

См. SecretKeyWrapper.java для хорошего примера этого