web-dev-qa-db-fra.com

Comment enregistrer Oauth Accéder au jeton en toute sécurité dans android

J'ai un jeton d'accès depuis le serveur après l'authentification permet de dire "uyhjjfjfgg567f8fhjkkf" maintenant je veux l'enregistrer dans l'appareil en toute sécurité. J'ai regardé dans Keystore et Keychain dans Android sites de développeurs. Je ne comprends pas clairement comment cela fonctionne et comment nous devrions récupérer le jeton du magasin de clés.

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();
16
George Thomas

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

Vous devez conserver le jeton d'actualisation, et vous avez quelques options pour cela:

  • Dans un fichier
    • Soit directement dans un fichier du stockage interne
    • ou en utilisant SharedPreferences
    • ou dans une base de données
  • Utilisation de AccountManager

Pensez à utiliser StoredCredential . Pour le flux lui-même, je vous recommande d'utiliser bibliothèque Google AppAuth .

Bien sûr, vous pouvez également crypter la clé à l'aide d'un 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ée dans le KeyStore.

17
rds

Ici vous pouvez trouver un très bon article par Androidauthority concernant les possibilités disponibles pour Android Security.

Un exemple complet de Android peut être trouvé ici .

Et une autre bonne option est keyczar de Google que vous pouvez suivre sur le dépôt git pour des exemples et des détails. Vous y trouverez également une liste détaillée des Problèmes de sécurité connus , afin que vous puissiez voir si cela convient à votre mise en œuvre ultérieure.

Pour votre problème actuel, je recommanderais de continuer Android Keystore en suivant l'exemple d'implémentation dans le deuxième lien ci-dessus.

Bonne chance !

4
Alex T

Nous utilisons une instance SharedPreference personnalisée qui chiffre les clés et les valeurs lors de l'ajout et les déchiffre 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 recommanderais d'utiliser SharedPreferences que si les valeurs sont chiffrées, car même si le fichier xml n'est disponible que pour l'application, il est accessible sur des appareils enracinés.

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

ÉDITER:

Un jeton oauth n'est absolument pas lié à la clé et au magasin de clés utilisés pour signer l'application.

Le jeton oauth est un jeton fourni par le serveur après avoir validé les informations d'identification de l'utilisateur, dans l'application.

Le magasin de clés contient un ou plusieurs certificats utilisés pour signer numériquement l'application. Il s'agit d'empêcher quelqu'un d'autre de télécharger une application portant le même nom de package que le vôtre et de la remplacer.

3
poetichustla