Использование программного обеспечения и аппаратного обеспечения Keystore для Android и возможных ограничений безопасности/удобства использования

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

Тем не менее у меня есть некоторые вопросы об аспектах безопасности и пользователей.

Программное обеспечение keystore

Для того, что я понял, в этой конфигурации masterkey выводится (используя PBKDF2) из ​​пароля пользователя (плюс соль, чтобы предотвратить атаки радужных таблиц) и используется для шифрования секретов. Насколько мне известно, пароль используется для экрана блокировки.

На некорректном телефоне только "хранилище ключей" пользователя может читать/записывать зашифрованные файлы и всякий раз, когда приложение хочет получить доступ к файлу, ему необходимо вызвать демон хранилища ключей, который проверяет, разрешен ли его UID для доступ к этому файлу (авторизации хранятся в базе данных sqlite).

Но есть еще некоторые детали, которые я не мог понять:

  • Используется ли хранилище ключей для использования экрана блокировки с защитой паролем?
  • Должен ли пользователь вводить свой пароль каждый раз, когда требуется доступ к зашифрованным ключам?
  • Учитывая, что это программный механизм, я думаю, что секретный ключ всегда будет дешифрован в ОЗУ всякий раз, когда он используется для криптографических операций, правильно?

Аппаратное хранилище ключей

Что касается аппаратной реализации, кажется, что производители SoC предоставляют решения, совместимые с [Global Platform TEE][2] (Trusted Execution Environment) со встроенными доверенными приложениями и API-интерфейсами, которые позволяют Google предоставлять аппаратное обеспечение своего хранилища ключей. Таким образом, можно хранить секретные ключи в TEE, запрашивать создание пары ключей RSA внутри TEE и подписывать или проверять данные, используя секретные ключи, хранящиеся внутри TEE. Таким образом, можно использовать секретные ключи для основных криптографических операций без их выхода из TEE.

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

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

Спасибо за ваше время!

Ответ 1

  • Используется ли хранилище ключей для использования блокировки, защищенной паролем экран?

Да, пользователь вынужден использовать экран блокировки, защищенный паролем, выводом или рисунком.

  • Должен ли пользователь вводить свой пароль каждый раз, когда доступ к требуется зашифрованные ключи?

Нет, как только устройство будет развязано, KeyStore также разблокируется, и нет необходимости вводить дополнительные пароли. Тем не менее, приложение должно проверить, разблокирован ли KeyStore, поскольку пользователь может отключить защиту экрана блокировки в настройках. Когда ключ заблокирован, KeyStore становится неинициализированным и должен быть разблокирован снова.

Несколько раз я столкнулся с странным поведением, когда KeyStore был заблокирован, но у меня не было настройки блокировки экрана. Мне было предложено ввести пароль или PIN-код для входа в KeyStore. Однако это было невозможно, так как у меня не было паролей. Я предполагаю, что некоторые системные приложения блокировали KeyStore. Мне пришлось reset его повторно инициализировать.

  • Учитывая, что это программный механизм, я думаю, что секретный ключ будет всегда заканчивается расшифровкой в ​​ОЗУ, когда он используется для криптографических операции, правильно?

Да, все ключи, извлеченные из KeyStore, будут находиться в ОЗУ до сбора мусора или деинициализации. Но вы можете получить ключ каждый раз, когда вам это нужно, а не держать его в какой-то долгоживущей переменной.

К сожалению, я не знаком с поддерживающим HW KeyStore. Не могу сказать ничего об этом.

Ответ 2

Ваш анализ основанного на TEE аппаратного сценария верен. Биты частного ключа, сгенерированные в TEE (которые не обязательно соответствуют спецификациям Global Platform), никогда не оставляют внутри него операции TEE и private key.

Вы также правы, что дескрипторы ключей на основе TEE хранятся в Keystore, поэтому root может получить доступ и использовать любой из них или перемещать их, чтобы любое приложение могло их использовать.