Я собираюсь использовать oAuth для получения писем и контактов из Google. Я не хочу каждый раз просить пользователя войти в систему, чтобы получить токен доступа и секрет. Из того, что я понял, мне нужно сохранить их с моим приложением либо в базе данных, либо в SharedPreferences
. Но я немного обеспокоен аспектами безопасности. Я читал, что вы можете шифровать и расшифровывать токены, но злоумышленнику просто просто декомпилировать apk и классы и получить ключ шифрования.
Какой лучший способ безопасного хранения этих токенов в Android?
Как безопасно хранить токен доступа и секрет в Android?
Ответ 1
Сохраните их как общие настройки. По умолчанию они закрыты, а другие приложения не могут получить к ним доступ. На корневых устройствах, если пользователь явно разрешает доступ к некоторому приложению, которое пытается их прочитать, приложение может использовать их, но вы не можете защитить их. Что касается шифрования, вам нужно либо потребовать от пользователя вводить кодовую фразу для дешифрования каждый раз (таким образом, преследуя цель кэширования учетных данных), либо сохранить ключ в файл, и вы получите ту же проблему.
Есть несколько преимуществ хранения токенов вместо фактического имени пользователя:
- Сторонние приложения не должны знать пароль, и пользователь может быть уверен, что он отправит его только на исходный сайт (Facebook, Twitter, Gmail и т.д.).
- Даже если кто-то украл токен, вы не увидите пароль (который пользователь может использовать и на других сайтах)
- Токены обычно имеют срок службы и истекают через определенное время
- Токены могут быть отозваны, если вы подозреваете, что они были скомпрометированы.
Ответ 2
Вы можете сохранить их в AccountManager. По мнению этих ребят, это считается лучшей практикой.
Здесь официальное определение:
Этот класс предоставляет доступ к централизованному реестру пользовательских онлайн-аккаунты. Пользователь вводит учетные данные (имя пользователя и пароль) один раз на учетную запись, предоставление приложениям доступа к онлайн-ресурсам с одобрением "одним щелчком".
Подробное руководство по использованию AccountManager:
Однако, в конце AccountManager сохраняет ваш токен как обычный текст. Поэтому я бы предложил зашифровать ваш секрет, прежде чем хранить их в AccountManager. Вы можете использовать различные библиотеки Encryption, такие как AESCrypt или AESCrypto
Другой вариант - использовать Conceal library. Это достаточно безопасно для Facebook и гораздо проще в использовании, чем AccountManager. Здесь фрагмент кода для сохранения секретного файла с помощью Conceal.
byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
Надеюсь, что это поможет.
Ответ 3
Ну, вы можете защитить маркер доступа, выполнив два параметра.
- Используйте сохранить токен доступа в хранилище ключей Android, которое не было бы обратным.
- Используйте функцию NDK с некоторыми вычислениями, которые сохраняют ваш токен и NDK с кодом С++, который очень трудно отменить.