2013-11-21 9 views
14

Ich erhalte von einem Web-Service (von mir selbst erstellt) einen RSA PrivateKey PKCS # 8, der in einer Basis 64 String kodiert ist. Meine Android App muss diesen Schlüssel irgendwo sicher in das Telefon speichern.Android KeyStore - So speichern Sie einen RSA PrivateKey

Ab der Version 4.3 von Android ist es möglich, Schlüssel mit der neuen KeyStore-API zu speichern. Ich habe eine article with code axample gefunden, die zeigt, wie man ein KeyPair mit der Spezifikation erzeugt, die benötigt wird, um die Schlüssel zu speichern. Und danach, um die Schlüssel wiederzubekommen.

// generate a key pair 
Context ctx = getContext(); 
Calendar notBefore = Calendar.getInstance() 
Calendar notAfter = Calendar.getInstance(); 
notAfter.add(1, Calendar.YEAR); 
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx) 
      .setAlias("key1") 
      .setSubject(
        new X500Principal(String.format("CN=%s, OU=%s", alais, 
          ctx.getPackageName()))) 
      .setSerialNumber(BigInteger.ONE).setStartDate(notBefore.getTime()) 
      .setEndDate(notAfter.getTime()).build(); 

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); 
kpGenerator.initialize(spec); 
KeyPair kp = kpGenerator.generateKeyPair(); 

// in another part of the app, access the keys 
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keyStore.load(null); 
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("key1", null); 
RSAPublicKey pubKey = (RSAPublicKey)keyEntry.getCertificate().getPublicKey(); 
RSAPrivateKey privKey = (RSAPrivateKey) keyEntry.getPrivateKey(); 

Aber ich verstehe nicht, wie kann ich einen vorhandenen Schlüssel zu speichern. Kann mir jemand helfen? Vielen Dank im Voraus

+0

http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html –

Antwort

8

In KeyStore müssen die privaten Schlüssel zusammen mit einem Zertifikat (auch ein gefälschtes selbstsigniertes Zertifikat) gespeichert werden. So speichern Sie Ihre Schlüssel in den AndroidKeyStore sollten Sie die folgenden Schritte aus:

  1. dekodieren die Base64 PKCS # 8 erhalten eine PrivateKey Instanz
  2. entweder die Webservice ein Zertifikat (oder eine Zertifikatskette) sendet zusammen mit dem privaten Schlüssel oder das PKCS # 8-Blob enthält auch den öffentlichen Schlüssel.
  3. Bei Bedarf müssen Sie ein Zertifikat für den privaten Schlüssel generieren. Die BouncyCastle Bibliothek kann dies tun (ein Codebeispiel kann here gefunden werden).

Jetzt können Sie Ihren Schlüssel zum Keystore hinzufügen.

PrivateKey myKey = getKey(); 
X509Certificate certificate = getCertificate(); 
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keyStore.load(null); 
keystore.setKeyEntry("anAlias", myKey, null, new Certificate[] { certificate });