Wie die store-Taste mit Android Key-Store-Anbieter

Ich versuche, mit der Android Key-Store-Anbieter, wurde in Android 4.3 sicher zu speichern, einen Privaten Schlüssel und verwenden Sie dann diese privaten Schlüssel zum verschlüsseln und entschlüsseln von Daten.

Ich denke, dass ich umgesetzt haben, ist die richtige Vorgehensweise und Codes für diese, so weit, aber ich stehe aktuell vor einer ungeraden Problem, dass ich nicht herausfinden.

Habe ich eine Klasse namens KeyStorage, dass ich verwenden, um erstellen Sie das Schlüsselpaar, das laden der KeyStore und das abrufen des privaten Schlüssels der code für diese Klasse ist wie folgt:

public class KeyStorage {

public static final String ANDROID_KEYSTORE = "AndroidKeyStore";
private KeyStore keyStore;

public void loadKeyStore() {
    try {
        keyStore = KeyStore.getInstance(ANDROID_KEYSTORE);
        keyStore.load(null);
        Enumeration<String> aliases = keyStore.aliases();
        while(aliases.hasMoreElements())
            Log.e("E", "Aliases = " + aliases.nextElement());
    } catch (Exception e) {
        //TODO: Handle this appropriately in your app
        e.printStackTrace();
    }
}

public void generateNewKeyPair(String alias, Context context)
        throws Exception {

    Calendar start = Calendar.getInstance();
    Calendar end = Calendar.getInstance();
    //expires 1 year from today
    end.add(1, Calendar.YEAR);

    KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
            .setAlias(alias)
            .setSubject(new X500Principal("CN=" + alias))
            .setSerialNumber(BigInteger.TEN)
            .setStartDate(start.getTime())
            .setEndDate(end.getTime())
            .build();

    //use the Android keystore
    KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", ANDROID_KEYSTORE);
    gen.initialize(spec);

    //generates the keypair
    gen.generateKeyPair();
}

public PrivateKey loadPrivteKey(String alias) throws Exception {

    if (keyStore.isKeyEntry(alias)) {
        Log.e("E", "Could not find key alias: " + alias);
        return null;
    }

    KeyStore.Entry entry = keyStore.getEntry(EnhancedCredentialStore.KEY_ALIAS, null);

    if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
        Log.e("E", " alias: " + alias + " is not a PrivateKey");
        return null;
    }

    return ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
}

Dann habe ich eine Klasse namens CredentialStore, dass ich versuche, dies zu nutzen. Ich erstelle ein alias namens "MySecureKey" und versuchen Sie zu erstellen und speichern eines privaten Schlüssels basierend auf dieser. So wie Sie sehen können, die ich versuche zu erstellen das neue Schlüsselpaar, basierend auf der Alias-laden Sie den Schlüsselspeicher und dann schließlich das abrufen des Privaten Schlüssels. Jedoch funktioniert es nicht.

public class CredentialStore {

public static final String KEY_ALIAS  = "MySecureKey";

private KeyStorage KeyStorage;

public CredentialStore(Activity context){

    keyStorage = new KeyStorage();
    try {
        keyStorage.generateNewKeyPair(KEY_ALIAS, context);
    } catch (Exception e) {
        e.printStackTrace();
    }
    blueBirdKeyStorage.loadKeyStore();

    try {
        keyStorage.loadPrivteKey(KEY_ALIAS);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

Bekomme ich die logs wie folgt:

Aliases = MySecureKey
Could not find key alias: MySecureKey

Also, wenn ich überprüfen Sie die Aliase in der loadKeyStore Methode wie es aussieht ist es dort wie es kommt wieder in die log. Jedoch, wenn ich versuche, es zu nennen mit dem loadKeyStore Methode bekomme ich das log sagt, es kann nicht finden, den Schlüssel "MySecureKey".

Ich finde keine Grund dafür und online recherchieren hat bewiesen, unfruchtbaren also ich Frage mich, ob jemand hat eine Idee, was könnte schief gehen?

  • 1. Erzeugen Sie ein Schlüsselpaar und nicht nutzen es. Ihre generateNewKeyPair Methode nichts zurückgibt. 2. Sie müssen nichts speichern, um KeyStore laden Sie es später. bitte entnehmen Sie eine Probe auf KeyStore-Verbrauch. Es könnte Ihnen helfen, developer.android.com/samples/BasicAndroidKeyStore/index.html
  • obwohl die vielen upvotes, Ihr Kommentar ist falsch: schauen Sie sich die offiziellen doc: developer.android.com/training/articles/... dies ist, wie Sie mit dem Android-Keystore - es ist nicht notwendig, um die Schlüssel explizit, wenn Sie die KeyFactory mit den Android Keystore-Instanz.
Schreibe einen Kommentar