0

Я использую хранилище ключей для генерации ключа/пары RSA, и код работает для уровней API 18-22. Сегодня, когда я запускал его на API-23, я не смог получить закрытый ключ из хранилища ключей. Ниже приведен код, который я использую:Закрытый ключ не генерируется в API-23 (Marshmallow)

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context) 
         .setAlias(utility.getConfigValue(configuration, OuterKeys.KEYSTORE_NAME)) 
         .setSubject(
           new X500Principal("CN=Sample Name, O=Android Authority")) 
         .setSerialNumber(BigInteger.ONE).setStartDate(start.getTime()) 
         .setEndDate(end.getTime()).build(); 
       KeyPairGenerator generator = null; 
       generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore"); 
       generator.initialize(spec); 
       KeyPair keyPair = generator.generateKeyPair(); 
       PrivateKey privateKey = keyPair.getPrivate(); 
       PublicKey publicKey = keyPair.getPublic(); 

       byte[] publicKeyBytes = publicKey.getEncoded(); 
       String pubKeyStr = Base64.encodeToString(publicKeyBytes, Base64.NO_PADDING); 
       byte[] privKeyBytes = privateKey.getEncoded(); 
       String privKeyStr = Base64.encodeToString(privKeyBytes, Base64.NO_PADDING); 

       Log.d("^^^^^^^^^1",pubKeyStr); 
       Log.d("^^^^^^^^^2",privKeyStr); 

Я отлажена это и обнаружил, что закрытый ключ, является недействительным. Принимая во внимание, что я могу напечатать строку открытого ключа по мере ее извлечения. Может кто-нибудь помочь, пожалуйста.

+0

Вы имеете в виду, что вы изменили целевую версию sdk на 23 или что вы используете ее на устройстве Android 6.0? – 1615903

+0

Я запускаю его на устройстве 6.0. – Sid

+2

'PrivateKey.getEncoded()' разрешено возвращать значение null. Глядя на [docs для AndroidKeyStore] (http://developer.android.com/training/articles/keystore.html), похожее на правильное поведение. –

ответ

1

Похоже, вы извлекаете экземпляр PrivateKey из Android Keystore просто отлично. Вы также сможете использовать этот экземпляр PrivateKey с примитивами Cipher и Signature.

Что не работает, это то, что getEncoded экземпляра PrivateKey возвращает null. Как отметил Джеймс К Полк, это работает по назначению. Предполагается, что getEncoded возвращает ключевой материал закрытого ключа (обычно в формате PKCS # 8 DER-encoded) или null, если экспорт материала не поддерживается. Android Keystore по дизайну не раскрывает/экспортирует ключевой материал закрытых ключей, и поэтому getEncoded возвращает null. На старых версиях платформы Android он, возможно, возвращал пустой массив байтов.

+0

Спасибо за ввод. Я думаю, что нулевой возврат прекрасен, и мне нужно перефразировать мой вопрос. Я получаю недопустимое ключевое исключение при попытке использовать закрытый ключ для подписывания или дешифрования любых данных. Я прочитал этот вопрос: http://stackoverflow.com/questions/32400689/crash-casting-to-rsaprivatekey. Но решение для меня не работает – Sid

+0

Просьба предоставить образец кода, который воспроизводит проблему и полную трассировку стека. Не уверен, как Stack Overflow предпочитает это, но лучше всего разместить все это как новый вопрос или отредактировать оригинал, чтобы включить новую информацию. –

+0

, поэтому проблема заключалась в том, что при запуске типа Marshmallow в RSAPrivateKey не работает. Для этого вопроса, хотя ваш ответ прекрасен. благодаря – Sid

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