2017-05-17 5 views
0

Ich versuche, einige Daten in meiner App mit this gist zu verschlüsseln.KeyStore kein Schlüssel für meinen Alias ​​gefunden

Ich habe meine Apk mit meinem Pseudonym "Pablo" unterschrieben. Das Problem versucht, diesen Code auszuführen:

public static String encrypt(String alias, String plaintext) { 
    try { 
     PublicKey publicKey = getPrivateKeyEntry(alias).getCertificate().getPublicKey(); 
     Cipher cipher = getCipher(); 
     cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
     return Base64.encodeToString(cipher.doFinal(plaintext.getBytes()), Base64.NO_WRAP); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

private static KeyStore.PrivateKeyEntry getPrivateKeyEntry(String alias) { 
    try { 
     KeyStore ks = KeyStore 
       .getInstance("AndroidKeyStore"); 
     ks.load(null); 
     KeyStore.Entry entry = ks.getEntry(alias, null); 

     if (entry == null) { 
      Log.w(TAG, "No key found under alias: " + alias); 
      Log.w(TAG, "Exiting signData()..."); 
      return null; 
     } 

     if (!(entry instanceof KeyStore.PrivateKeyEntry)) { 
      Log.w(TAG, "Not an instance of a PrivateKeyEntry"); 
      Log.w(TAG, "Exiting signData()..."); 
      return null; 
     } 
     return (KeyStore.PrivateKeyEntry) entry; 
    } catch (Exception e) { 
     Log.e(TAG, e.getMessage(), e); 
     return null; 
    } 
} 

Aber im die Ausnahme erhalten: "Kein Schlüssel unter Alias ​​gefunden"

Jede Idee? Ich muss den gleichen Alias ​​wie meine jks richtig eingeben?

Danke!

+0

haben Sie versucht, auf den Kommandozeilen-Schlüsselspeicher Aliase Auflistung http: //stackoverflow.com/a/12894334/1056359 – thepoosh

+0

Ja, das alias its ok, versuchen Im es auf debug mit signierten apk –

+0

in welcher Zeile des Codes die Ausnahme auftritt? Stellen Sie sicher, dass Sie den richtigen Keystore von der Anwendung verwenden, in der Sie die App ausführen. Die verwendete Laufzeit-JRE könnte eine andere sein und einen anderen Schlüsselspeicher ohne Ihren Alias ​​enthalten. – Sonic

Antwort

2

Die Antwort von Sonic richtig ist, dass die Java Key Store, dass Sie die App aus dem Schlüsselspeicher anders nutzen zu unterzeichnen ist, dass Sie in Ihrer Anwendung verwenden. Ersteres ist eine Datei auf Ihrem Computer (Ihr Laptop), während letzteres nur auf dem Handy ist, auf dem Sie Ihre App installieren (ein Android-Telefon oder ein Emulator). Das Signieren Ihrer App, sodass sie im Play Store veröffentlicht werden kann, und das Verschlüsseln der privaten Daten des Nutzers in Ihren Daten sind unterschiedliche Verfahren.

In Fällen, in denen es nicht klar ist, sollten Sie versuchen, auf kanonische Quellen und nicht auf willkürliche Unterschiede und Tutorials zu verweisen, die in ihrer Qualität stark variieren. In diesem Fall enthält die official Android documentation for KeyStore ein vollständiges Beispiel zum Speichern von Schlüsseln. Bitte beachten Sie, dass der im Gist referenzierte Android KeyStore nur für API 18+ verfügbar ist.

Zugegeben, die Codebeispiele in der offiziellen Dokumentation und der Gist sind ziemlich komplex und es ist einfach, einen Fehler zu machen. Eine bessere Option könnte etwas wie Scytale sein. Es ist ein Wrapper um den Schlüsselspeicher an, den Fall korrekt behandelt, wo API < 18. Hier ist ein Codeausschnitt ist zu zeigen:

Store store = new Store(getApplicationContext()); 
if (!store.hasKey("test")) { 
    SecretKey key = store.generateSymmetricKey("test", null); 
} 
... 

// Get key 
SecretKey key = store.getSymmetricKey("test", null); 

// Encrypt/Decrypt data 
Crypto crypto = new Crypto(Options.TRANSFORMATION_SYMMETRIC); 
String text = "Sample text"; 

String encryptedData = crypto.encrypt(text, key); 
Log.i("Scytale", "Encrypted data: " + encryptedData); 

String decryptedData = crypto.decrypt(encryptedData, key); 
Log.i("Scytale", "Decrypted data: " + decryptedData); 

Beachten Sie, dass Sie immer noch einen Schlüssel, um erstellen, müssen Daten zu verschlüsseln, unabhängig davon, Der Status Ihrer .jks auf Ihrem Hostcomputer. Der Code in der Probe vorhanden ist richtig:

if there is no key in the keystore with that alias 
    make a new key with that alias 
use the key to encrypt and decrypt data. 
1

Der Schlüsselspeicher, nach dem Sie in Ihrer App fragen, ist nicht derselbe Schlüsselspeicher wie Ihr lokaler Schlüsselspeicher, um die App zu signieren: Sie können dies überprüfen, indem Sie ks.containsAlias(alias) anrufen. Sie müssen den Alias ​​in Ihrem Runtime-Keystore angeben. Sie haben einen Eintrag für Ihr Alias ​​erstellen: setEntry(String alias, KeyStore.Entry entry, KeyStore.ProtectionParameter protParam) (Saves a keystore Entry under the specified alias.)

+0

Ich bin nicht sicher mit Ihrer Antwort, muss ich meinen Keystore verwenden, um Daten zu verschlüsseln, Warum muss ich einen neuen Alias ​​erstellen? –

Verwandte Themen