2013-04-04 1 views
0

Je construis une application android qui a besoin de stocker des données sécurisées sur un appareil Android qui supporte également une ancienne version d'android avant 4.0. Je sais que Android 4.0 et la version après cette chaîne de clé de soutien, mais mon application doit prendre en charge les anciennes versions. Donc, n'importe qui peut aider et laissez-moi savoir quelle méthode utilisée dans la version OS d'Android.Comment ancienne version d'android avant 4.0 stocker des données comme mot de passe, accesstoken en toute sécurité?

+0

Pour bonne lecture, voir [Voir Unifier l'accès au magasin de clés dans ICS] (http://android-developers.blogspot.com/2012/03/unifying-key-store-access-in-ics.html) et [Utilisation de l'ICS API KeyChain] (http://nelenkov.blogspot.com/2011/11/using-ics-keychain-api.html). – jww

Répondre

2

Sur les versions Android précédentes à ICS, vous pouvez utiliser KeyStore, voici un exemple de stockage à KeyStore:

public boolean setEntry(String alias, String secretKey) { 

    boolean keyStoreEntryWritten = false; 

    if (mKeystore != null && secretKey != null) { 
     // store something in the key store 
     SecretKeySpec sks = new SecretKeySpec(secretKey.getBytes(), "MD5"); 
     KeyStore.SecretKeyEntry ske = new KeyStore.SecretKeyEntry(sks); 
     KeyStore.ProtectionParameter pp = new KeyStore.PasswordProtection(null); 

     try { 
      mKeystore.setEntry(alias, ske, pp); 

      // save key store 
      boolean success = saveKeyStore(); 

      if (success) { 
       keyStoreEntryWritten = true; 
      } 
     } catch (KeyStoreException ex) { 
      Log.e(TAG, "Failed to read keystore" + mKeyStoreName); 
     } 
    } 
    return keyStoreEntryWritten; 
} 


private boolean saveKeyStore() { 

    FileOutputStream fos = null; 
    boolean keyStoreSaved = true; 

    // generate key store path 
    String keyStoreFilePath = generateKeyStoreFilePath(mKeyStoreName, mKeystoreDirectoryPath); 


    try { 
     fos = new FileOutputStream(keyStoreFilePath); 
     mKeystore.store(fos, mKeyStorePassword.toCharArray()); 
    } catch (Exception ex) { 
     keyStoreSaved = false; 
     Log.e(TAG, "Failed to save keystore " + mKeyStoreName); 
    } finally { 
     if (fos != null) { 
      try { 
       fos.close(); 
      } catch (IOException ex) { 
       keyStoreSaved = false; 
       Log.e(TAG, "Failed to close FileOutputStream"); 
      } 
     } 
    } 
    return keyStoreSaved; 
} 

Vous pouvez trouver plus d'informations ici: http://developer.android.com/reference/java/security/KeyStore.html

EDIT: ici est la façon dont vous récupérez une clé:

public String getEntry(String alias) { 

    String secretStr = null; 
    byte[] secret = null; 

    if (mKeystore != null) { 



     try { 
      if (!mKeystore.containsAlias(alias)) { 
       Log.w(TAG, new StringBuilder().append("Keystore ").append(mKeyStoreName) 
         .append(" does not contain entry ").append(alias).toString()); 
       return null; 
      } 
     } catch (KeyStoreException ex) { 
      Log.e(TAG, "Failed to read keystore entry " + alias); 
     } 

     // get my entry from the key store 
     KeyStore.ProtectionParameter pp = new KeyStore.PasswordProtection(null); 
     KeyStore.SecretKeyEntry ske = null; 
     try { 
      ske = (KeyStore.SecretKeyEntry) mKeystore.getEntry(alias, pp); 
     } catch (Exception ex) { 
      Log.e(TAG, "Failed to read keystore entry " + alias); 
     } 

     if (ske != null) { 
      SecretKeySpec sks = (SecretKeySpec) ske.getSecretKey(); 
      secret = sks.getEncoded(); 

      if (secret != null) { 
       secretStr = new String(secret); 


      } else { 
       Log.e(TAG, new StringBuilder().append("Read empty keystore entry ").append(alias).toString()); 
      } 
     } else { 
      Log.e(TAG, "Failed to read keystore entry " + alias); 
     } 
    } 
    return secretStr; 
} 
+0

Merci à nous. C'est vraiment utile, mais maintenant mon souci est que je dois stocker secretKey quelque part à droite et ainsi de nouveau la question se pose de savoir comment le stocker en toute sécurité? Corrigez-moi si je me trompe. – user1522804

+0

J'ai ajouté un exemple de récupération de la clé - espérons que cela aide –

+0

Encore une fois merci inistel. Après avoir regardé le code, j'ai toujours des inquiétudes sur le mKeyStorePassword. Est-ce sûr, je veux dire, si je comprends bien, il peut y avoir un accès et il n'y a pas de sécurité pour ça? Corrigez-moi si je me trompe. – user1522804

Questions connexes