Как безопасно хранить маркер доступа и секретный в Android?



Я собираюсь использовать oAuth для извлечения почты и контактов из google. Я не хочу каждый раз просить пользователя войти в систему, чтобы получить маркер доступа и секрет. Из того, что я понял, мне нужно хранить их с моим приложением либо в базе данных, либо SharedPreferences. Но я немного обеспокоен аспектами безопасности с этим. Я читал, что вы можете шифровать и расшифровывать токены, но злоумышленнику легко просто декомпилировать ваш apk и классы и получить ключ шифрования.
что лучший способ безопасно хранить эти токены в Android?

922   5  

5 ответов:

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

есть несколько преимуществ хранения токенов вместо фактического пароля пользователя:

  • сторонним приложениям не нужно знать пароль, и пользователь может быть уверен, что они отправляют его только на исходный сайт (Facebook, Twitter, Gmail и т. д.)
  • даже если кто-то украдет знак, не видим пароль (который пользователь может использовать на других сайтах)
  • маркеры, как правило, имеют продолжительность жизни и истекает после определенного время
  • маркеры могут быть отозваны, если вы подозреваете, что они были скомпрометированы

вы можете хранить их в AccountManager. Это считается лучшей практикой в соответствии с этими парнями.

enter image description here

вот официальное определение:

этот класс предоставляет доступ к централизованному реестру пользователя онлайн-аккаунты. Пользователь вводит учетные данные (имя пользователя и пароль) один раз для каждой учетной записи, предоставление приложений доступ к интернет-ресурсам с одним щелчком" утверждение.

подробное руководство по использованию AccountManager:

однако в конечном счете AccountManager сохраняет только ваш токен в виде обычного текста. Поэтому я бы предложил зашифровать ваш секрет, прежде чем хранить их в AccountManager. Вы можете использовать различные библиотеки шифрования, такие как AESCrypt или AESCrypto

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

byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
  1. на панели проекта Android Studio выберите " файлы проекта "и создайте новый файл с именем" keystore.свойства " в корневом каталоге вашего проекта.

enter image description here

  1. открыть "хранилище.свойства " файл и сохраните маркер доступа и секрет в файле.

enter image description here

  1. теперь загрузите read the Access Token and Secret в свой app модуль построить.gradle. Затем вам нужно определить переменную BuildConfig для вашего токена доступа и секрета, чтобы вы могли получить к ним прямой доступ из своего кода. Ваш построить.gradle может выглядеть следующим образом:

    ... ... ... 
    
    android {
        compileSdkVersion 26
    
        // Load values from keystore.properties file
        def keystorePropertiesFile = rootProject.file("keystore.properties")
        def keystoreProperties = new Properties()
        keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
        defaultConfig {
            applicationId "com.yourdomain.appname"
            minSdkVersion 16
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
            // Create BuildConfig variables
            buildConfigField "String", "ACCESS_TOKEN", keystoreProperties["ACCESS_TOKEN"]
            buildConfigField "String", "SECRET", keystoreProperties["SECRET"]
        }
    }
    
  2. вы можете использовать маркер доступа и секрет в своем коде следующим образом:

    String accessToken = BuildConfig.ACCESS_TOKEN;
    String secret = BuildConfig.SECRET;
    

таким образом, вам не нужно хранить маркер доступа и Секретный в виде простого текста внутри вашего проекта. Поэтому, даже если кто-то декомпилирует ваш APK, они никогда не получат ваш токен доступа и секрет, поскольку вы загружаете их из внешнего файла.

SharedPreferences не безопасное место. На корневом устройстве мы легко может читать и изменять xml SharedPrefereces всех приложений. даже если токен истекает каждый час, новые токены все еще могут быть украдены из SharedPreferences. Хранилище ключей Android должно использоваться для долгосрочного хранения и извлечения криптографических ключей, которые будут использоваться для шифрования наших токенов, чтобы хранить их, например, в SharedPreferences. Ключи не хранятся в приложении процесс, так они сложнее чтобы быть нарушена.

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

  1. используйте сохранить маркер доступа в хранилище ключей android, который не будет обратным.
  2. используйте функцию NDK с некоторыми вычислениями, которые сохраняют ваш токен и NDK с кодом c++, который очень трудно отменить

Comments

    Ничего не найдено.