2017-04-26 3 views
10

J'ai un token d'accès depuis le serveur après authentification, disons "uyhjjfjfgg567f8fhjkkf" maintenant je veux le sauvegarder dans l'appareil en toute sécurité. J'ai regardé dans Keystore et Keychain dans les sites de développement Android. Je ne comprends pas clairement comment cela fonctionne et comment nous devrions récupérer le jeton du keystore.Comment enregistrer le token Oauth Access en toute sécurité en android

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
     KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); 
kpg.initialize(new KeyGenParameterSpec.Builder(
     alias, 
     KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY) 
     .setDigests(KeyProperties.DIGEST_SHA256, 
      KeyProperties.DIGEST_SHA512) 
     .build()); 

KeyPair kp = kpg.generateKeyPair(); 


/* 
* Load the Android KeyStore instance using the the 
* "AndroidKeyStore" provider to list out what entries are 
* currently stored. 
*/ 

KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 
Enumeration<String> aliases = ks.aliases(); 

Répondre

9

Vous n'avez pas besoin d'enregistrer le jeton d'accès, car il a de toute façon une durée de vie courte. Le garder en mémoire est assez bon.

vous avez besoin de garder le jeton de rafraîchissement, et vous avez quelques options pour que:

  • Dans un fichier
    • Soit directement dans un fichier dans la mémoire interne
    • ou à l'aide SharedPreferences
    • ou dans une base de données
  • aide t il AccountManager

Envisagez d'utiliser le StoredCredential. Pour le flux lui-même, je vous recommande d'utiliser Google AppAuth library.

Bien sûr, vous pouvez également chiffrer la clé en utilisant un algorithme de chiffrement:

private static byte[] encrypt(byte[] key, byte[] text) throws GeneralSecurityException { 
    final SecretKeySpec skeySpec = new SecretKeySpec(key, KEY_ALGORITHM); 
    final Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, sInitVectorSpec); 
    return cipher.doFinal(text); 
} 

Et la clé peut être stocké dans le KeyStore.

2

Here Vous pouvez trouver un très bon article par Androidauthority concernant les possibilités offertes par Android Security.

Un exemple complet d'implémentation de magasin de clés Android peut être trouvé here.

Et une autre bonne option est Google's keyczar que vous pouvez suivre sur le dépôt git pour les échantillons et les détails. Là, vous pouvez également trouver une liste détaillée de Known Security Issues, de sorte que vous pouvez voir si cela convient à votre mise en œuvre ultérieure.

Pour votre numéro actuel, je vous recommande d'aller sur Android Keystore en suivant l'exemple de l'implémentation dans le deuxième lien ci-dessus.

Bonne chance!

0

Nous utilisons une instance SharedPreference personnalisée qui crypte les clés et les valeurs lors de l'ajout et les décrypte lors de la demande.

SecurePreferences preferences = ... 
preferences.edit().putString("key", "value").apply(); // key and value are encrypted automatically 

String value = preferences.getString("key", null); // key and value are decrypted automatically 

Je ne recommande d'utiliser SharedPreferences si les valeurs sont cryptées, car même si le fichier xml est uniquement disponible à l'application, il peut être consulté sur les dispositifs ancrés.

Si vous utilisez déjà un SqlLiteDB, je l'utiliserais probablement. Si ce n'est pas le cas, c'est un peu lourd pour simplement enregistrer un jeton.

EDIT:

Un jeton OAuth est sans aucun rapport avec la clé et keystore utilisé pour signer l'application.

Le jeton oauth est un jeton fourni par le serveur après la validation des informations d'identification de l'utilisateur, dans l'application.

Le fichier de clés contient un ou plusieurs certificats utilisés pour signer numériquement l'application. C'est pour empêcher quelqu'un d'autre de télécharger une application qui a le même nom de paquet que le vôtre et de le remplacer.