Использование программного обеспечения и аппаратного обеспечения 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 может получить доступ и использовать любой из них или перемещать их, чтобы любое приложение могло их использовать.