0

我一直在使用密鑰庫來生成RSA密鑰對,並且代碼一直在爲API級別18-22工作。 今天,當我在API-23上運行它時,我無法從密鑰庫中檢索私鑰。 下面是我一直使用的代碼:私鑰在API-23(棉花糖)中沒有生成

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。看看[Android的AndroidKeyStore的文檔](http://developer.android.com/training/articles/keystore.html),似乎是正確的行爲。 –

回答

1

它看起來像你從Android Keystore檢索PrivateKey實例就好了。你應該可以使用這個PrivateKey實例和Cipher和Signature原語。

什麼是「不工作」是那個PrivateKey實例的getEncoded返回null。正如James K Polk所說,這是按預期工作的。 getEncoded應該返回私鑰的密鑰材料(通常採用PKCS#8 DER編碼格式),如果不支持密鑰材料導出,則返回null。 Android Keystore按設計不會顯示/導出私鑰的密鑰材料,因此getEncoded將返回null。在較舊的Android平臺版本上,它可能已經返回空字節數組。

+0

感謝您的輸入。我認爲空回報是好的,我需要重述我的問題。嘗試使用私鑰簽名或解密任何數據時,我遇到了無效的密鑰異常。我讀過這個問題:http://stackoverflow.com/questions/32400689/crash-casting-to-rsaprivatekey。但該解決方案對我無效 – Sid

+0

請提供重現問題的示例代碼和完整堆棧跟蹤。不確定Stack Overflow如何使用它,但最好將所有這些發佈爲新問題或編輯原始文件以包含新信息。 –

+0

所以問題是,在棉花糖類型鑄造到RSAPrivateKey不工作。對於這個問題,儘管你的答案是完美的。謝謝 – Sid