Безопасный способ хранения закрытых ключей в приложении для Android

Dec 21 2020

Как лучше всего хранить закрытые ключи для подписи штрих-кода в приложении для Android? Вероятно, большинство здешних экспертов скажут - просто не делайте этого, потому что это небезопасно ...

Но я хотел бы понять уровень «незащищенности» и рисков предлагаемых решений.

PS Товарные смартфоны предполагать.

PS не так уж часто можно обмениваться ключами. App Backend API может быть разработан по мере необходимости. Но постоянное подключение к Интернету и варианты подписи на стороне сервера невозможны.

Ответы

28 defalt Dec 21 2020 at 22:40

Все устройства Android 7+ оснащены Trusted Execution Environment (TEE) в качестве обязательного требования для лицензирования приложений Google. Это хранилище ключей с аппаратной поддержкой, которое обеспечивает изолированное хранение и обработку данных для криптографических BLOB-объектов. В SoC Qualcomm Snapdragon и Samsung Exynos TEE основан на ARM Trustzone . Некоторые устройства, такие как Pixel и iPhone, имеют свой собственный дискретный TEE (чип Google Titan M и Apple T2), который называется сейфом . Дискретные TEE более изолированы, чем ARM Trustzone, и не зависят от используемой SoC.

Вы можете использовать API провайдера хранилища ключей Android для

  • генерировать закрытые ключи

  • генерировать секретные ключи

  • подписать и проверить данные

  • импортировать зашифрованные ключи

  • аутентифицировать пользователя для использования ключа

  • Проверка пар ключей с аппаратной поддержкой с помощью Key Attestation

Для каждого ключа, хранящегося в хранилище ключей, могут быть установлены следующие параметры:

  • псевдоним - используется для идентификации ключа.
  • размер ключа (API 23).
  • цель - зашифровать / расшифровать (API 23).
  • режим шифрования, алгоритм и заполнение (API 23).
  • должен ли ключ быть аутентифицирован в хранилище ключей перед использованием? (API 23).
  • время, в течение которого ключ может использоваться после успешной аутентификации (API 23).
  • должен ли ключ становиться недействительным при регистрации нового отпечатка пальца? (API 24)
  • должно ли хранилище ключей требовать разблокировки экрана перед выполнением криптографических операций? (API 28)
  • должен ли ключ быть защищен аппаратным модулем безопасности StrongBox? (API 28)

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


«Должен ли ключ быть защищен аппаратным модулем безопасности StrongBox? (API 28)» представляется очень важным с точки зрения общего уровня безопасности.

Для Android 9+ приложения могут настроить хранение ключей в сейфе, позвонив setIsStrongBoxBacked(true). Если он сработает, StrongBoxUnavailableExceptionприложения должны вернуться к хранилищу ключей с аппаратной поддержкой. Strongbox защищен от критических уязвимостей побочного канала в процессоре SoC, которые могут повлиять на хранилище ключей с аппаратной поддержкой. Безопасность хранилища ключей с аппаратной поддержкой ложится на плечи производителя микросхем SoC: из-за зияющей «дыры» в мобильном хранилище Qualcomm Secure World произошла утечка конфиденциальных данных .

В рекомендациях по аппаратной безопасности рекомендуется использовать StrongBox Keymaster . Модуль содержит следующее:

  • Собственный процессор
  • Надежное хранение
  • Настоящий генератор случайных чисел.
  • Дополнительные механизмы защиты от взлома пакетов и несанкционированной загрузки приложений.

Система хранилища ключей Android

Насколько безопасна аутентификация в хранилище ключей Android? (Устаревший, опубликованный до выпуска Android 10)