Попробуйте это
@GET("users/{user}/repos")
Call<Response> listRepos(@Path("user") String user)
Сохраните их как общие настройки. По умолчанию они закрыты, а другие приложения не могут получить к ним доступ. На корневых устройствах, если пользователь явно разрешает доступ к некоторому приложению, которое пытается их прочитать, приложение может использовать их, но вы не можете защитить их. Что касается шифрования, вам нужно либо потребовать от пользователя вводить кодовую фразу для дешифрования каждый раз (таким образом, преследуя цель кэширования учетных данных), либо сохранить ключ в файл, и вы получите ту же проблему.
Есть несколько преимуществ хранения токенов вместо фактического имени пользователя:
Вы можете сохранить их в AccountManager .
Вот официальное определение:
Этот класс предоставляет доступ к централизованный реестр учетных записей пользователей. Пользователь вводит учетные данные (имя пользователя и пароль) один раз на одну учетную запись, предоставляя приложениям доступ к онлайн-ресурсам с одобрением «одним щелчком».
blockquote>Подробное руководство по использованию AccountManager:
Однако в конце AccountManager сохраняет ваш токен только как обычный текст. Поэтому я бы предложил зашифровать ваш секрет, прежде чем хранить их в AccountManager. Вы можете использовать различную библиотеку шифрования, такую как AESCrypt или AESCrypto
. Другой вариант - использовать библиотеку Conceal . Это безопасно для Facebook и гораздо проще в использовании, чем AccountManager. Вот фрагмент кода для сохранения секретного файла с помощью Conceal.
byte[] cipherText = crypto.encrypt(plainText); byte[] plainText = crypto.decrypt(cipherText);
SharedPreferences не является безопасным местоположением. На корневом устройстве мы легко можем читать и модифицировать все приложения «SharedPrefereces xml». Даже если токен истекает каждый час, более новые жетоны все равно могут быть украдены из SharedPreferences. Android KeyStore следует использовать для долговременного хранения и извлечения криптографических ключей, которые будут использоваться для шифрования наших токенов, чтобы хранить их, например. SharedPreferences. Клавиши не сохраняются в процессе приложения, поэтому они сложнее , чтобы быть скомпрометированы.
Ну, вы можете защитить токен доступа, выполнив следующие два параметра.
... ... ...
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"]
}
}
String accessToken = BuildConfig.ACCESS_TOKEN;
String secret = BuildConfig.SECRET;
Таким образом, вы не нужно хранить токен доступа и секретный текст в тексте внутри вашего проекта. Поэтому, даже если кто-то декомпилирует ваш APK, они никогда не получат ваш токен доступа и секретность, поскольку вы загружаете их из внешнего файла.