2016-04-19 16 views
9

Ich verwende eine SecretKey, um vertrauliche Daten in meiner Anwendung zu verschlüsseln. Derzeit speichere ich meinen SecretKey im Base64-kodierten Format in DB oder SharedPrefs, was kein sicherer Ort ist, um Secret auf einem gerooteten Telefon zu speichern. Daher möchte ich meinen SecretKey zu Android KeyStore verschieben. Das Problem, mit dem ich konfrontiert bin, ist, wenn ich versuche, this sample code von Google, ein PrivateKey statt SecretKey. Ich konnte keine Möglichkeit finden, meinen SecretKey in KeyStore zu speichern und für die spätere Verwendung zu laden. Ich versuchte dies:Android: Store SecretKey in KeyStore

private static void writeSecretKeyToKeystore(SecretKey secretKey, Context context) { 
KeyStore keyStore = null; 
try { 
    keyStore = KeyStore.getInstance("AndroidKeyStore"); 
    keyStore.load(null); 
    KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey); 
    keyStore.setKeyEntry("Key", secretKeyEntry.getSecretKey().getEncoded(), null); 
} catch (KeyStoreException e) { 
    e.printStackTrace(); 
} catch (CertificateException e) { 
    e.printStackTrace(); 
} catch (NoSuchAlgorithmException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Wenn ich oben Code versuchen, es löst eine Ausnahme Operation not supported because encoding is unknown.

Jeder Beispielcode wäre eine große Hilfe.

+0

versuchen Sie Folgendes: keyStore.setEntry ("Key", secretKeyEntry, null); –

+0

Es wird nicht kompiliert und sagt 'Falscher 2. Argumenttyp. Gefunden 'SecretKeyEntry'; erforderte 'byte []' '. – Rajkiran

+0

Bitte ändern Sie 'setKeyEntry' auf 'setEntry'. –

Antwort

5

FALSCH
java.security.KeyStore können sowohl symmetrische als auch asymmetrische Schlüssel speichern. Sie müssen nur KeyStore.SecretKeyEntry instanziiert es Ihre SecretKey in den Konstruktor übergeben und dann den Schlüsselspeicher # setEntry Methode verwenden, um sie zu speichern:

keyStore.setEntry(
    "key1", 
    new KeyStore.SecretKeyEntry(secretKey), 
    new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) 
      .setBlockMode(KeyProperties.BLOCK_MODE_GCM) 
      .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) 
      .build()); 

it out Gebrauch Um wieder:

SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null); 

UPDATE
Nach einigen Recherchen war ich überrascht zu erfahren, dass AndroidKeyStore keine symmetrischen Schlüssel unterstützt. (siehe die Diskussion: https://groups.google.com/forum/#!topic/android-developers/gbmIRKRbfq8)

+0

Ich sehe keine Methode auf KeyStore, die SecretKeyEntry-Objekt akzeptiert. Auch Ihre Antwort erwähnt, wie man Zugang erhält, mehr als wie man den Eintrag einstellt. Bitte überprüfen Sie meine aktualisierte Frage. – Rajkiran

+0

Beide Methoden (getEntry und setEntry) befassen sich mit der KeyStore.Entry-Schnittstelle (siehe: http://developer.android.com/reference/java/security/KeyStore.Entry.html). KeyStore.SecretKeyEntry implementiert diese Schnittstelle, sodass Sie sie überall dort verwenden können, wo KeyStore.Entry erwartet wird. –

+1

Dies funktioniert nicht bei API <23. Ich entwickle eine App, die mit Lollipop beginnt. Ich benutze diesen Code keyStore.setEntry ("key1", neuer KeyStore.SecretKeyEntry (secretKey), neuer KeyStoreParameter.Builder (Kontext) .setEncryptionRequired (true) .build()); aber es würde nicht funktionieren. Upvoted Ihre Antwort obwohl. – Rajkiran