В настоящее время я изучаю возможности хранения/использования ключей секретов в приложении для 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. Я прав?
Спасибо за ваше время!