2013-11-21 10 views
14

Otrzymuję od usługi sieciowej (wykonanej przeze mnie) RSA PrivateKey PKCS # 8 zakodowanej w 64-bitowym łańcuchu bazowym. Moja aplikacja na Androida musi bezpiecznie zapisać ten klucz w telefonie.Android KeyStore - jak zapisać klucz prywatny RSA

Z wersji 4.3 systemu Android możliwe jest zapisywanie kluczy przy użyciu nowego interfejsu API KeyStore. Znalazłem article with code axample, który pokazuje, jak wygenerować KeyPair ze Specyfikacją potrzebną do przechowywania kluczy. A potem odzyskać klucze.

// 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(); 

Ale nie rozumiem, jak mogę zapisać istniejący klucz do niego. Czy ktoś może mi pomóc? Z góry z góry

+0

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

Odpowiedz

8

W KeyStore klucze prywatne muszą być przechowywane wraz z certyfikatem (nawet fałszywym podpisem z podpisem własnym). Aby zapisać swój klucz w AndroidKeyStore należy wykonać następujące kroki:

  1. dekodowania Base64 PKCS # 8, aby uzyskać PrivateKey instancji
  2. albo serwis internetowy wysyła (lub łańcucha certyfikatów) zaświadczenie wraz z kluczem prywatnym lub blob PKCS # 8 zawiera również klucz publiczny.
  3. w razie potrzeby należy wygenerować certyfikat dla klucza prywatnego. Może to zrobić biblioteka BouncyCastle (próbka kodu znajduje się pod numerem here).

Teraz możesz dodać swój klucz do magazynu kluczy.

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