Comment stocker en toute sécurité le jeton d'accès et le secret dans Android?

Je vais utiliser oAuth pour récupérer des mails et des 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 soit dans une base de données ou SharedPreferences. Mais je suis un peu inquiet des aspects de sécurité avec cela. J'ai lu que vous pouvez chiffrer et déchiffrer les jetons, mais il est facile pour un attaquant de décompiler simplement votre apk et vos classes et d'obtenir la clé de chiffrement.
Quelle est la meilleure méthode pour stocker en toute sécurité ces jetons dans Android?

90
demandé sur mmBs 2012-04-15 14:38:38

5 réponses

Stockez - les en tant que préférences partagées. Ceux-ci sont par défaut privés, et d'autres applications ne peuvent pas y accéder. Sur un périphérique enraciné, si l'Utilisateur autorise explicitement l'accès à une application qui tente de les lire, l'application peut être en mesure de les utiliser, mais vous ne pouvez pas vous protéger contre cela. En ce qui concerne le chiffrement, vous devez soit exiger de l'utilisateur d'entrer la phrase secrète 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:

  • les applications tierces n'ont pas besoin de connaître le mot de passe et l'utilisateur peut être sûr qu'il ne l'envoie qu'au site d'origine (Facebook, Twitter, Gmail, etc.)
  • même si quelqu'un vole un jeton, il ne voit pas le mot de passe (que l'utilisateur peut également utiliser sur d'autres sites)
  • Les jetons ont généralement une durée de vie et expirent après un certain temps
  • Les jetons peuvent être révoqués si vous pensez qu'ils ont été compromis
97
répondu Nikolay Elenkov 2012-04-15 16:03:52

Vous pouvez les stocker dans AccountManager. C'est considéré comme la meilleure pratique selon ces gars-là.

entrez la description de l'image ici

Voici la définition officielle:

Cette classe donne accès à un registre centralisé des comptes en ligne. L'utilisateur entre des informations d'identification (nom d'utilisateur et mot de passe) une fois par compte, accorder aux applications l'accès aux ressources en ligne avec" one-click " approbation.

Pour un guide détaillé sur la façon d'utiliser AccountManager:

Cependant, à la fin AccountManager ne stocke votre jeton que sous forme de texte brut. Donc, je suggère de crypter votre secret avant de les stocker dans AccountManager. Vous pouvez utiliser différentes bibliothèques de chiffrement comme AESCrypt ou AESCrypto

Une Autre option est d'utiliser Dissimuler bibliothèque. C'est assez sûr pour Facebook et beaucoup plus facile à utiliser que AccountManager. Voici un extrait de code pour enregistrer un fichier secret en utilisant Conceal.

byte[] cipherText = crypto.encrypt(plainText);
byte[] plainText = crypto.decrypt(cipherText);
13
répondu aldok 2018-05-01 13:52:12
  1. dans le volet Projet de votre studio Android, sélectionnez "Fichiers de projet" et créez un nouveau fichier nommé "keystore".propriétés " dans le répertoire racine de votre projet.

entrez la description de l'image ici

  1. Ouvrir "fichier de clés.propriétés " fichier et enregistrer votre jeton D'accès et Secret dans le fichier.

entrez la description de l'image ici

  1. Chargez maintenant la lecture du jeton D'accès et du Secret dans la construction de votre app module .fichier gradle . Ensuite, vous devez définir l' BuildConfig variable pour votre jeton D'accès et Secret afin que vous puissiez y accéder directement à partir de votre code. Votre construction .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"]
        }
    }
    
  2. Vous pouvez utiliser votre jeton D'accès et votre Secret dans votre code comme ceci:

    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. Donc, même si quelqu'un décompile votre APK, il n'obtiendra jamais votre jeton D'accès et votre Secret pendant le chargement à partir d'un fichier externe.

4
répondu Zahidur Rahman Faisal 2018-01-04 06:37:22

SharedPreferences n'est pas un emplacement sécurisé. Sur un périphérique enraciné, nous pouvons facilement Lire et modifier les xml SharedPrefereces de toutes les applications. même si un jeton expire toutes les heures, les nouveaux jetons peuvent toujours être volés dans 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 dans Par exemple SharedPreferences. Les clés ne sont pas stockées dans le processus d'une application, donc ils sont plus difficiles compromise.

2
répondu apex39 2018-03-01 09:13:25

Eh bien, vous pouvez sécuriser votre jeton d'accès en suivant deux options.

  1. Utilisez enregistrer votre jeton d'accès dans le magasin de clés android qui ne serait pas inverse.
  2. Utilisez la fonction NDK avec un calcul qui enregistre votre jeton et NDK avec du code C++ très difficile à inverser
2
répondu M.Noman 2018-08-11 17:14:52