Je vais utiliser oAuth pour récupérer les courriers et les contacts de Google. Je ne veux pas demander à l'utilisateur de se connecter à chaque fois pour obtenir un jeton d'accès et un secret. D'après ce que j'ai compris, Je dois les stocker avec mon application dans une base de données ou SharedPreferences
. Mais je suis un peu inquiet pour les aspects de sécurité. Je lis que vous pouvez chiffrer et déchiffrer les jetons, mais il est facile pour un attaquant de Il suffit de décompiler votre apk et vos classes pour obtenir la clé de cryptage.
Quelle est la meilleure méthode pour stocker en toute sécurité ces jetons dans Android?
Stockez-les en tant que préférences partagées. Celles-ci sont par défaut privées et les autres applications ne peuvent y accéder. Sur un appareil enraciné, si l'utilisateur autorise explicitement l'accès à une application qui tente de la lire, l'application peut peut-être les utiliser, mais vous ne pouvez pas vous protéger contre cela. En ce qui concerne le chiffrement, vous devez obliger l'utilisateur à saisir la phrase secrète de déchiffrement à chaque fois (ce qui rend caduque la mise en cache des informations d'identification) ou bien enregistrer la clé dans un fichier et vous obtenez le même problème.
Il y a quelques avantages à stocker des jetons au lieu du mot de passe d'utilisateur actuel:
Vous pouvez les stocker dans AccountManager . C'est considéré comme la meilleure pratique selon ces gars.
Voici la définition officielle:
Cette classe permet d'accéder à un registre centralisé des comptes en ligne de l'utilisateur. L'utilisateur entre les informations d'identification (nom d'utilisateur et mot de passe) une fois par compte, ce qui permet aux applications d'accéder aux ressources en ligne avec l'approbation d'un clic.
Pour un guide détaillé sur l'utilisation de AccountManager:
Cependant, à la fin, AccountManager stocke uniquement votre jeton sous forme de texte brut. Je suggère donc de chiffrer votre secret avant de le stocker dans AccountManager. Vous pouvez utiliser différentes bibliothèques de chiffrement telles que AESCrypt ou AESCrypto
Une autre option consiste à utiliser bibliothèque de dissimulation . C'est assez sûr pour Facebook et beaucoup plus facile à utiliser que AccountManager. Voici un extrait de code pour enregistrer un fichier secret avec Dissimulation.
byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
Maintenant, chargez le code d'accès et le secret de lecture dans votre build de l'application du module fichier. Vous devez ensuite définir la variable BuildConfig pour votre jeton d’accès et votre secret afin de pouvoir y accéder directement à partir de votre code. Votre build.gradle peut ressembler à ceci:
... ... ...
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"]
}
}
Vous pouvez utiliser votre code d'accès et votre code secret dans votre code comme suit:
String accessToken = BuildConfig.ACCESS_TOKEN;
String secret = BuildConfig.SECRET;
De cette façon, vous n'avez pas besoin de stocker le jeton d'accès et le secret en texte brut dans votre projet. Ainsi, même si quelqu'un décompile votre fichier APK, il ne pourra jamais obtenir votre code d'accès et votre code secret car vous les chargez à partir d'un fichier externe.
SharedPreferences n'est pas un emplacement sécurisé lui-même. Sur un appareil enraciné, nous pouvons facilement lire et modifier toutes les applications SharedPrefereces xml de toutes les applications. Les jetons doivent donc expirer relativement souvent. Toutefois, même si un jeton expire toutes les heures, les nouveaux jetons peuvent toujours être volés dans les références partagées. Android KeyStore devrait être utilisé pour le stockage à long terme et la récupération de clés cryptographiques qui seront utilisées pour chiffrer nos jetons afin de les stocker dans, par exemple, SharedPreferences ou une base de données. Les clés ne sont pas stockées dans une base de données. processus de l'application, de sorte qu'ils sont plus difficiles être compromis.
La façon dont ils peuvent être eux-mêmes sécurisés est donc plus pertinente qu'un lieu, par exemple. en utilisant des JWT de courte durée signés cryptographiquement, en les chiffrant avec Android KeyStore et en les envoyant avec un protocole sécurisé)
Eh bien, vous pouvez sécuriser votre jeton d’accès en suivant deux options.