2017-02-08 8 views
0

Мне нужно сгенерировать RSA 2018 Keypair, а затем сохранить его и восстановить, если он существует.Сохранить и восстановить KeyPair в AndroidKeystore

На данный момент у меня есть это:

SecureRandom random = new SecureRandom(); 
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(keySize, RSAKeyGenParameterSpec.F4); 
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "SC"); 
generator.initialize(spec, random); 
return generator.generateKeyPair(); 

Это работает отлично, но теперь я попытался спасти и принять его из Android хранилища ключей, но я не его достижения. Я судимое:

String alias = "TESTINGKEY"; 
     KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     keyStore.load(null); 
     if (!keyStore.containsAlias(alias)) { 
      SecureRandom random = new SecureRandom(); 
      RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(keySize, RSAKeyGenParameterSpec.F4); 
      KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "SC"); 
      generator.initialize(spec, random); 
      return generator.generateKeyPair(); 
     } else { 
      Key key = keyStore.getKey(alias, null); 
      if (key instanceof PrivateKey) { 
       Certificate cert = keyStore.getCertificate(alias); 
       return new KeyPair(cert.getPublicKey(), (PrivateKey) key); 
      } else { 
       return null; 
      } 
     } 

Но не работает правильно, потому что на втором запуске приложения, хранилища ключей не содержит KeyPair.

В https://developer.android.com/training/articles/keystore.html?hl=es Я видел, что KeyGenParameterSpec, у строителя есть значение «alias», но int RSAKeyGenParameterSpec нет.

Как его сохранить?

ответ

3

С помощью AndroidKeyStore необходимо использовать KeyGenParameterSpec.Builder для генерации ключей. Также используйте AndroidKeyStore вместо SC. Вы можете использовать следующий код

Генерировать ключи (Android> = 23)

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
       KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); 

kpg.initialize(new KeyGenParameterSpec.Builder(
       alias, 
       KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY) 
       .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) 
       .setKeySize(keySize) 
       .build()); 

KeyPair keyPair = kpg.generateKeyPair(); 

Загрузить ключи

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keyStore.load(null); 
KeyStore.Entry entry = keyStore.getEntry(alias, null); 
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey(); 
PublicKey publicKey = keyStore.getCertificate(alias).getPublicKey(); 
+0

Я попробовал то, что вы размещаете @pedrofb, но сейчас, когда я пытаюсь использовать keypair.getPrivateKey(). getEncoded(), запускает исключение nullPointerException, потому что этот getEnconded() имеет «ничего» внутри. – Shudy

+0

Ключевой материал ключей, хранящихся в Keystore Android, недоступен. Вы можете использовать клавиши, но вы не можете их извлечь. Это ограничение безопасности – pedrofb

+0

@ Сьюди - мой ответ ясен? Если вам нужно извлечь содержимое секретного ключа, вы не сможете использовать 'AndroidKeyStore', но можете использовать его отлично, и это рекомендуется для обеспечения безопасности. Извлечение закрытого ключа для хранения в файле означает, что вам понадобятся дополнительные меры безопасности – pedrofb

Смежные вопросы