Я собираюсь использовать oAuth для получения писем и контактов из Google. Я не хочу каждый раз просить пользователя войти в систему, чтобы получить токен доступа и секрет. Насколько я понял, мне нужно хранить их вместе с моим приложением либо в базе данных, либо SharedPreferences
. Но меня немного беспокоят аспекты безопасности. Я читал, что вы можете шифровать и расшифровывать токены, но злоумышленнику легко просто декомпилировать ваш apk и классы и получить ключ шифрования.
Как лучше всего безопасно хранить эти токены в Android?
124
Ответы:
Сохраните их как общие настройки . По умолчанию они являются частными, и другие приложения не могут получить к ним доступ. На устройствах с root-доступом, если пользователь явно разрешает доступ к какому-либо приложению, которое пытается их прочитать, приложение может использовать их, но вы не можете защитить от этого. Что касается шифрования, вы должны либо требовать от пользователя вводить парольную фразу для дешифрования каждый раз (таким образом нарушая цель кэширования учетных данных), либо сохранять ключ в файл, и вы получите ту же проблему.
Хранение токенов вместо фактического пароля пользователя дает несколько преимуществ:
источник
Вы можете сохранить их в AccountManager . По мнению этих парней, это считается лучшей практикой.
Вот официальное определение:
Подробное руководство по использованию AccountManager:
Однако в конечном итоге AccountManager сохраняет ваш токен только в виде простого текста. Поэтому я бы посоветовал зашифровать ваши секреты, прежде чем сохранять их в AccountManager. Вы можете использовать различные библиотеки шифрования, такие как AESCrypt или AESCrypto.
Другой вариант - использовать библиотеку Conceal . Это достаточно безопасно для Facebook и намного проще в использовании, чем AccountManager. Вот фрагмент кода для сохранения секретного файла с помощью Conceal.
источник
SharedPreferences не является безопасным местом. На устройстве с рутированным доступом мы легко можем читать и изменять файлы SharedPrefereces xml всех приложений. Таким образом, токены должны истекать относительно часто. Но даже если токен истекает каждый час, новые токены все равно можно украсть из SharedPreferences. Android KeyStore следует использовать для длительного хранения и извлечения криптографических ключей, которые будут использоваться для шифрования наших токенов, чтобы хранить их, например, в SharedPreferences или в базе данных. Ключи не хранятся в процессе приложения, поэтому их сложнее взломать.
Поэтому более важным, чем место, является то, как они могут быть защищены, например, с помощью криптографически подписанных короткоживущих JWT, шифруя их с помощью Android KeyStore и отправляя их с помощью безопасного протокола.
источник
Теперь загрузите прочитанные токен доступа и секрет в файл build.gradle вашего модуля приложения . Затем вам нужно определить переменную BuildConfig для вашего токена доступа и секрета, чтобы вы могли напрямую обращаться к ним из своего кода. Ваш build.gradle может выглядеть следующим образом:
Вы можете использовать свой токен доступа и секрет в своем коде следующим образом:
Таким образом, вам не нужно хранить токен доступа и секрет в виде обычного текста внутри вашего проекта. Таким образом, даже если кто-то декомпилирует ваш APK, он никогда не получит ваш токен доступа и секрет, поскольку вы загружаете их из внешнего файла.
источник
Что ж, вы можете защитить свой токен доступа, используя следующие два варианта.
источник