Подтвердить что ты не робот

Как система Android Keystore может быть защищена?

Я прочитал документацию по Android в http://developer.android.com/training/articles/keystore.html Но мне не хватает некоторых деталей...

Если приложение генерирует ключ (симметричный или асимметричный) с помощью AndroidKeyStore.

Можем ли мы извлечь ключ из этого хранилища ключей?

Может ли другое приложение (AppB) получить доступ к ключу, сгенерированному AppA?

В каких случаях можно потерять ключ? Только сброс настроек устройства?

Благодарю.

4b9b3361

Ответ 1

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

KeyStore (API 1)

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

Поставщик Android KeyStore (API 18)

Используя этот API, вы делегируете всю тяжелую работу по управлению файлом и секретом на Android. Вам не нужно будет использовать какой-либо пароль, так как сама ОС будет хранить его, исходя из вашего PIN-кода экрана блокировки, пароля, шаблона и других переменных.

Если устройство содержит встроенное защищенное оборудование, ключ будет храниться там (например, Trusted Execution Environment (TEE)). Вы можете проверить KeyInfo # isInsideSecureHardware() метод, чтобы увидеть, сохранен ли ключ там или нет. Этот аппаратный механизм обеспечивает нам дополнительную защиту на случай, если наше приложение работает на скомпрометированном ядре Linux.

Кроме того, начиная с Android 9 (уровень API 28), StrongBox Keymaster API был представлен для тех устройств, которые содержат защищенный чип (например, Titan M в Google Pixel 3). Если вы работаете на Android 28 или выше, вам просто нужно вызвать метод setIsStrongBoxBacked (логический), чтобы сообщить Android, что вы хотите использовать его, если он доступен на устройстве. Несмотря на то, что вышеупомянутое решение TEE является приемлемым, этот механизм использования защищенного элемента (SE) является наиболее безопасным, поскольку он основан на другом оборудовании (ЦП, памяти, хранилище и т.д.), Предназначенном для целей безопасности.

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore")
        .apply {
            val certBuilder = KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT)
                .setKeyValidityStart(keyValidityStart)
                .setKeyValidityEnd(keyValidityEnd)
                .setCertificateSerialNumber(BigInteger.valueOf(1L))
                .setCertificateSubject(X500Principal("CN=MyCompany"))

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                initialize(
                    certBuilder
                        .setIsStrongBoxBacked(true) /* Enable StrongBox */
                        .build()
                )
            } else {
                initialize(certBuilder.build())
            }
        }
        .also {
            val keyPair = it.generateKeyPair()
            ...
        }
}

По поводу ваших вопросов:

Можем ли мы извлечь ключ из этого хранилища ключей?

С обоими из них ваше приложение может получить PrivateKey и использовать его, если вы это имеете в виду.

Может ли другое приложение (AppB) получить доступ к ключу, сгенерированному AppA?

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

В каком случае мы можем потерять ключ? Только сброс настроек устройства?

Удаление приложения удалит экземпляр поставщика KeyStore вашего приложения. Однако из- за неприятной ошибки в Android (более распространенной до Android 5), если пользователь изменяет шаблон экрана блокировки на пароль или просто удаляет шаблон, KeyStore будет полностью поврежден. То же самое происходит, когда пользователь выполняет "Очистить учетные данные" из настроек Android. Вместо этого, используя классический KeyStore, вы можете сохранить его во внешнем хранилище и сохранить его даже после сброса настроек устройства. Однако, как упоминалось ранее, он все еще менее безопасен, чем поставщик.

Я могу ошибаться в некоторых аспектах, но это то, чему я учусь, и я просто поделился своим опытом. Надеюсь, это полезно для вас.