Добрый день, друзья. Познакомился с этой группой на крайнем мосдроиде, Георгий упомянул её в докладе :) И, собственно, примерно по теме доклада и будет мой к вам вопрос.
Помогите пожалуйста советом. Столкнулся с неприятной необходимостью хранить внутри приложения секретную строку.
Я решил прибегнуть к следующему: использую AndroidKeystore, генерирую случайный SecretKey для AES и храню его в KeyStore. С помощью этого ключа шифрую и ложу в шаредпрефы свою строку.
Для того чтобы не палить строку в коде, сделал служебный экран, который используется для того чтобы принять от пользователя строку, сгенерить AESный ключ в кейсторе, зашифровать и сохранить её в префы. Т.е. потенциальное вытаскивание из исходников отметается. Девайс вроде как поддерживает Hardware backed ключи и операции с ними проводит в TEE.
Приложение будет использоваться нешироким кругом пользователей и только на одних определённых устройствах (там API 23).
Ситуация в том что конфиденциальность этой строки превыше всего. Устройства служебные и будут выдаваться на руки. Предполагаю что наша строка будет "прошиваться" нами в устройства руками, это не самый удобный сценарий, но для нас это ок. Если работоспособность приложения пропадёт, ничего страшного не случится. Главное не раскрыть строку.
При необходимости получить и использовать значение строки в коде я совершаю ряд проверок и в случае фейла хотя бы одной из них кейстор и префы зачищаются:
- Получаю ключ из кейстора, дергаю его KeyInfo и проверяю что isInsideSecureHardware() возвращает true
- Посильно проверяю на отсутствие рута (наличие известных бинарников su, пакетов известных менеджеров рут-доступа, readonly состояние системных директорий итд)
Есть мысли добавить проверки google safetynet, который помогает проверить что апкшник не был изменён после выкачивания из стора (не знаком с технологией лично, только почитал о ней) а также содержит какие то свои проверки на рут.
Подскажите пожалуйста, нормальное ли это решение и/или какие ещё меры нужно принять? Можно ли как то эту строку выпотрошить из приложения в рантайме? Моих знаний о безопасности андроида не хватает для полноценного решения этой задачи, поэтому обращаюсь к вам.
Заранее спасибо.
Внесу свою лепту. Надо четко разобрать от кого вы хотите защищаться:
- Обычный телефон
- Рутованный телефон
- Телефон с Xposed
Если кейс "Если телефон попал человеку в руки, шоб он не смог достать ключ", то тут невозможно защититься, если сам аппарат уязвим. Обязательно надо включить шифрование и вот это все. Кароч, от хакера с рутом на аппарате нереально защититься, т.е. надо максимально усложнить установку рута на аппарате