Je vais utiliser oAuth pour récupérer les e-mails et les contacts de Google. Je ne veux pas demander à chaque fois à l'utilisateur de se connecter pour obtenir un jeton d'accès et un secret. D'après ce que j'ai compris, j'ai besoin de les stocker avec mon application soit dans une base de données, soit SharedPreferences
. Mais je suis un peu inquiet pour les aspects de sécurité avec cela. J'ai lu que vous pouvez crypter et décrypter les jetons, mais il est facile pour un attaquant de simplement décompiler votre apk et vos classes et d'obtenir la clé de cryptage.
Quelle est la meilleure méthode pour stocker ces jetons en toute sécurité sur Android?
123
Réponses:
Stockez-les en tant que préférences partagées . Ceux-ci sont par défaut privés et les autres applications ne peuvent pas y accéder. Sur un appareil enraciné, si l'utilisateur autorise explicitement l'accès à une application qui tente de les lire, l'application pourra peut-être les utiliser, mais vous ne pouvez pas vous protéger contre cela. En ce qui concerne le chiffrement, vous devez soit demander à l'utilisateur de saisir la phrase de passe de déchiffrement à chaque fois (ce qui va à l'encontre du but de la mise en cache des informations d'identification), soit 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 du nom d'utilisateur réel:
la source
Vous pouvez les stocker dans AccountManager . C'est considéré comme la meilleure pratique selon ces gars.
Voici la définition officielle:
Pour un guide détaillé sur l'utilisation de AccountManager:
Cependant, à la fin, AccountManager stocke uniquement votre jeton sous forme de texte brut. Donc, je suggérerais de crypter votre secret avant de les stocker dans AccountManager. Vous pouvez utiliser diverses bibliothèques de chiffrement comme AESCrypt ou AESCrypto
Une autre option consiste à utiliser la bibliothèque Dissimuler . C'est suffisamment sûr pour Facebook et beaucoup plus facile à utiliser que AccountManager. Voici un extrait de code pour enregistrer un fichier secret à l'aide de Conceal.
la source
SharedPreferences n'est pas un emplacement sécurisé en lui-même. Sur un appareil enraciné, nous pouvons facilement lire et modifier les fichiers XML SharedPrefereces de toutes les applications. Les jetons devraient donc expirer relativement fréquemment. Mais même si un jeton expire toutes les heures, les nouveaux jetons peuvent toujours être volés à SharedPreferences. Android KeyStore doit être utilisé pour le stockage à long terme et la récupération des clés cryptographiques qui seront utilisées pour crypter nos jetons afin de les stocker par exemple dans SharedPreferences ou une base de données. Les clés ne sont pas stockées dans le processus d'une application, elles sont donc plus difficiles à compromettre.
Donc, plus pertinent qu'un lieu, c'est comment ils peuvent être eux-mêmes sécurisés, par exemple en utilisant des JWT de courte durée signés cryptographiquement, en les chiffrant à l'aide d'Android KeyStore et en les envoyant avec un protocole sécurisé
la source
Maintenant charger la lecture du jeton d' accès et secret dans votre application du module build.gradle fichier. Ensuite, vous devez définir la variable BuildConfig pour votre jeton d'accès et secret afin que vous puissiez y accéder directement à partir de votre code. Votre build.gradle peut ressembler à ceci:
Vous pouvez utiliser votre jeton d'accès et votre secret dans votre code comme ceci:
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 APK, il n'obtiendra jamais votre jeton d'accès et votre secret car vous les chargez à partir d'un fichier externe.
la source
Eh bien, vous pouvez sécuriser votre jeton d'accès en suivant deux options.
la source