2016-04-08 14 views
2

Ich versuche, eine verschlüsselte Standard-Realm-Instanz in meiner App einzurichten. Die Idee ist, einen Schlüssel mit einem KeyPairGenerator mit einem bestimmten Alias ​​zu generieren, speichern Sie es in AndroidKeyStore und verwenden Sie den Schlüssel jedes Mal, wenn es benötigt wird.Bereich mit Schlüssel verschlüsseln, der in KeyStore gespeichert wird

, was ich tun

Dies ist, wie ich den Schlüssel erzeugen:

KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
     ks.load(null); 

     if (!ks.containsAlias(KEY_ALIAS)) { 

      Calendar start = Calendar.getInstance(); 
      Calendar end = Calendar.getInstance(); 
      end.add(Calendar.YEAR, 99); 

      KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this) 
        .setAlias(KEY_ALIAS) 
        .setSubject(new X500Principal("CN=Example, O=ExampleOrg")) 
        .setSerialNumber(BigInteger.ONE) 
        .setStartDate(start.getTime()) 
        .setEndDate(end.getTime()) 
        .build(); 

      KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); 
      generator.initialize(spec); 

      KeyPair keyPair = generator.generateKeyPair(); 
     } 

Ich bin mit dem KeyPairGenerator als i api Versionen 18 und höher unterstützen müssen.

Hier ist, wie ich mein Setup Standard-Realm Beispiel in meiner Anwendung:

RealmConfiguration config = null; 
    try { 
     config = new RealmConfiguration 
       .Builder(this) 
       .encryptionKey(ks.getKey(KEY_ALIAS, null).getEncoded()) 
       .name("dealmatrix.realm") 
       .schemaVersion(1) 
       .build(); 

wo ks eine Schlüsselspeicher-Instanz wie so erworben wird:

Keystore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 

WAS FALSCH GOES

Mein Problem ist, dass dieser Ausdruck:

ks.getKey(KEY_ALIAS, null).getEncoded() 

gibt null zurück, was verständlicherweise zu einer Ausnahme führt.

Ich habe online gelesen, dass dies das beabsichtigte Verhalten des KeyStore-Systems ist.

Wenn ich tatsächlich nicht in der Lage bin, das Byte-Array des gespeicherten Verschlüsselungsschlüssels zu erhalten, wie soll ich mein Realm mit diesem Schlüssel verschlüsseln?

Gibt es andere Methoden, um einen Verschlüsselungsschlüssel sicher zu speichern, damit ich ihn in meiner Realmkonfiguration verwenden kann?

+0

Haben Sie irgendeine Lösung herausgefunden, ich bin auch mit diesem Problem konfrontiert – saikrupa

Antwort

0

Android Keystore-Schlüssel, die null von getEncoded zurückgeben, funktionieren wie vorgesehen. getEncoded soll das Schlüsselmaterial des privaten Schlüssels (normalerweise im PKCS # 8 DER-kodierten Format) oder null zurückgeben, wenn der Schlüsselmaterialexport nicht unterstützt wird. Android Keystore enthüllt/exportiert Schlüsselmaterial von privaten oder geheimen Schlüsseln nicht und gibt daher getEncoded null zurück. Siehe https://developer.android.com/training/articles/keystore.html#SecurityFeatures.

Sie können diese Schlüssel immer noch gut mit Signature und Cipher Abstraktionen verwenden.

+0

Ok, ich verstehe. Was du sagst, ergibt Sinn, aber das beantwortet meine Frage nicht wirklich. Wie kann ich dann sicher einen Verschlüsselungsschlüssel für meine Realm-Konfiguration speichern? – Rakatan

+0

Was ist ein Reich?Im Allgemeinen können Sie Daten mit dem Cipher-Primitiv verschlüsseln, das Sie mit einer Key-Instanz initialisieren. In diesem Fall können Sie eine Key-Instanz von Android Keystore abrufen. –

+0

https://realm.io/. Es ist eine Datenbank. Ich weiß, wie der Keystore funktioniert, aber die Verschlüsselungsmethode der Datenbank akzeptiert nur ein Byte-Array. – Rakatan

Verwandte Themen