Как безопасно сохранять секретный ключ в android

Я просто прочитал эту статью http://android-developers.blogspot.in/2013/02/using-cryptography-to-store-credentials.html, где я научился генерировать ключ безопасности.

Я хочу знать, как безопасно сохранить этот сгенерированный ключ, чтобы хакеры не получили этот четный телефон.

Если мы сохраним этот SharedPreference, Storage, тогда хакер может это получить.

Спасибо.

Ответы

Ответ 1

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

Вы можете использовать EncryptedPreferences для хранения простых данных зашифрованным способом.

Однако только быстрый взгляд на исходный код показывает, что вы должны передать пароль в приложении init.

EncryptedPreferences encryptedPreferences = new EncryptedPreferences.Builder(this).withEncryptionPassword("password").build();

Это утечка безопасности, если пароль жестко запрограммирован. Это не является предпочтительным методом.

Вы можете использовать предоставленную ссылку и создать одноразовый блокнот.

public static SecretKey generateKey() throws NoSuchAlgorithmException {
    // Generate a 256-bit key
    final int outputKeyLength = 256;

    SecureRandom secureRandom = new SecureRandom();
    // Do *not* seed secureRandom! Automatically seeded from system entropy.
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(outputKeyLength, secureRandom);
    SecretKey key = keyGenerator.generateKey();
    return key;
}

Конечно, учитывается идеальная ситуация, где функция генерации ключей идеально случайна.

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

Преимущество: ключ отличается для каждой установки приложения. Это означает, что если взломщик узнал, как работает шифр, он все еще не может расшифровать другие устройства, если у него нет доступа к такому устройству SharedPreferences.

Ответ 2

Если вы создаете и используете ключ в приложении, может быть интересно использовать новый (API 18+) Android Keystore Provider, Ключ сохраняется специальным защищенным сервисом, который может использовать защищенное оборудование, если оно доступно.

Он не хранит существующий ключ (созданный в другом месте), но позволяет создавать и использовать ключи без доступа к самому секретному ключу. Идея состоит в том, что секретный ключ никогда не покидает безопасный сервис, поэтому никто не может его извлечь, даже ваше приложение (или root, если используется безопасное оборудование).

Он также позволяет ограничить использование ключа (например, на фиксированную длительность после аутентификации пользователя)

Ответ 3

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


Пример: WhatsApp

После установки WhatsApp создает учетную запись пользователя, используя один номер телефона в качестве имени пользователя (Jabber ID: [номер телефона] @s.whatsapp.net). Пароль генерируется с использованием неизвестного алгоритма на сервере и отправляется клиенту.

Но если телефон укоренен, вы можете легко извлечь этот пароль, упомянув здесь.

WhatsApp использует сквозное шифрование, он хранит все свои данные в зашифрованном виде во внутреннем хранилище.


Пример: Snapchat

Snapchat заявила, что Snapchatters, использующие устройство Rooted Android, будут заблокированы при входе в систему.


Предложение

Что вы можете сделать, так это использовать смесь методов как гигантскими приложениями WhatsApp, так и Snapchat i.e

  • Заблокируйте телефоны, укоренившиеся
  • Убедитесь, что пароль "Пользовательский" (каждый пользователь имеет собственный ключ), а не "App-specific" (тот же на всех устройствах).
  • Сохранить пароль на сервере и получить его при каждом запуске приложения (проверить и удалить, не хранить)
  • Убедитесь, что все ваши данные зашифрованы.

Ответ 4

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

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

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

Ответ 5

Правило защиты. Не изобретайте свою собственную безопасность. Вы не можете создать способ безопасного хранения секретного ключа на любом устройстве. Когда вы только что научились генерировать ключ.

Я просто прочитал эту статью http://android-developers.blogspot.in/2013/02/using-cryptography-to-store-credentials.htmlгде я научился генерировать ключ безопасности.

Способ, который уже был изобретен, - заставить пользователя ввести строку (то, что не сохраняется на телефоне) и использовать строку для шифрования.

Неиспользуемый строковый метод легко разбивается, копируя ПЗУ на мощную машину и используя грубую силу.