2017-03-09 4 views
0

Ich speichere gerade einen RSA-Schlüssel in meiner Android-Anwendung, er soll für die In-App-Verschlüsselung von Benutzer-App-Daten verwendet werden.Wo ist der Schlüsselspeicher?

erzeugen ich den Schlüssel und speichern Sie es als Datei im Schlüssel Verzeichnis wie so zu speichern:

public RSA(char[] password) throws Exception 
{ 
    private static final String filePath = System.getProperty("user.dir") + "/keys/"; 
    mCurrentPassword = password; 
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    File possibleKeyFile = new File(filePath + "/" + keyAlias); 
    //FileInputStream keyFile = new FileInputStream(filePath + "/" + keyAlias); 

    if(!possibleKeyFile.exists()) //if keystore is empty, create a key 
    { 
     mCurrentCertificate = generateCert(); 
     //Store the new keypair 
     ks.load(null, password); 

     KeyStore.ProtectionParameter protParam = 
       new KeyStore.PasswordProtection(password); 

     java.security.cert.Certificate[] myCert = 
       new java.security.cert.Certificate[] { 
         (java.security.cert.Certificate) mCurrentCertificate 
       }; 

     KeyStore.PrivateKeyEntry pkEntry = 
       new KeyStore.PrivateKeyEntry(mCurrentRSAKeyPair.getPrivate(), 
         myCert); 

     ks.setEntry(keyAlias, pkEntry, protParam); 
     OutputStream os = new FileOutputStream(new File(filePath + "/" + keyAlias)); 

     ks.store(os , password); 

    } 
    else 
    { 
     //retrieve keypair and assign it to mCurrentKeyPair 
     mCurrentRSAKeyPair = getKey(keyAlias, password); 
    } 
} 

Wenn ich den Schlüsselspeicher auf meinem Android im Debug-Modus abzurufen erhalte ich eine Fehlermeldung, die Datei existiert nicht (ungültiges Verzeichnis). Ich frage mich, wo der Schlüssel tatsächlich gespeichert wird, wenn der Speicherpfad so eingestellt ist?

Code Keypair abzurufen:

private static KeyPair getKey(String alias, char[] password) throws Exception 
{ 
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    FileInputStream keyFile = new FileInputStream(filePath + "/" + alias); 
    ks.load(keyFile, password); 

    KeyStore.ProtectionParameter protParam = 
      new KeyStore.PasswordProtection(password); 

    KeyStore.PrivateKeyEntry privateKeyEntry = 
      (KeyStore.PrivateKeyEntry) ks.getEntry(alias, protParam); 
    RSAPrivateKey privateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey(); 
    //get public key from private key 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    RSAPrivateKeySpec priv = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class); 
    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(priv.getModulus(), BigInteger.valueOf(65537)); 
    PublicKey publicKey = kf.generatePublic(keySpec); 

    KeyPair kp = new KeyPair(publicKey, privateKey); 

    return kp; 
} 
+0

Worauf ist filePath eingestellt? Das ist, was Sie den Schlüssel zu – dweebo

Antwort

0
OutputStream os = new FileOutputStream(new File(filePath + "/" + keyAlias)); 

Bevor Sie diese Zeile ausführen sollten Sie dies ausführen ein:

filePath.mkdirs(); 

Derzeit ist es möglich, dass das Verzeichnis 'Schlüssel' doesn‘ Es gibt sie, und Sie tun nichts, um sicherzustellen, dass es funktioniert.

Sie müssen den Ausgabestrom auch nach dem Speichern des Keystores schließen. Es scheint, dass Sie auch eine IOException oder FileNotFoundException irgendwo ignorieren.

+0

speichern Hallo, der Pfad ist bereits erstellt und es schlägt beim Abrufen des Schlüsselspeichers nicht die Erstellung des Schlüsselspeichers fehl. Prost – James

+0

So hat "Alias" nicht den gleichen Wert wie bei der Erstellung. Natürlich brauchen Sie als Teil des Dateinamens überhaupt keinen Alias, da Keystores mehrere Aliase enthalten können. Sie könnten einfach einen festen Dateinamen verwenden, z. 'System.getProperty (" user.dir ") +" /.keystore "'. Und natürlich, wenn Sie bereits das Schlüsselpaar und das Zertifikat haben, warum brauchen Sie überhaupt die Keystore-Datei? – EJP

+0

Hallo, ich brauche den Keystore, damit ich jedes Mal, wenn ich die App neu lade, immer das gleiche Schlüsselpaar und das gleiche Zertifikat beibehalte, anstatt die Daten zu löschen und neu zu generieren. – James