web-dev-qa-db-fra.com

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

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?

105
yeahman

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:

  • Les applications tierces n'ont pas besoin de connaître le mot de passe et l'utilisateur peut être sûr de ne l'envoyer 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 pourrait é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
105
Nikolay Elenkov

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

enter image description here

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);
15
aldok
  1. Dans la sous-fenêtre Projet de Android Studio, sélectionnez "Fichiers de projet" et créez un nouveau fichier nommé "keystore.properties" dans le répertoire racine de votre projet.

enter image description here

  1. Ouvrez le fichier "keystore.properties" et enregistrez votre jeton d'accès et votre secret dans le fichier.

enter image description here

  1. 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"]
        }
    }
    
  2. 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.

6

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é)

5
apex39

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

  1. Utilisez enregistrer votre jeton d’accès dans Android magasin de clés qui ne serait pas inversé).
  2. Utilisez la fonction NDK avec certains calculs qui sauvegardent votre jeton et votre NDK avec un code c ++ très difficile à inverser
1
M.Noman