我正在尝试使用导入的密钥库密钥对一段数据进行签名:
我的密钥首先在AndroidKeyStore外部生成(这是有意的) 然后导入到AndroidKeyStore
使用以下方式:
val keyGen = KeyPairGenerator.getInstance("RSA")
keyGen.initialize(2048)
val keyPair = keyGen.generateKeyPair()
val keyProtectionSign = KeyProtection.Builder(KeyProperties.PURPOSE_SIGN or //
KeyProperties.PURPOSE_VERIFY).setDigests(KeyProperties.DIGEST_SHA256) //
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) //
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
.build()
keyStore.setEntry(signatureAlias,
KeyStore.PrivateKeyEntry(keyPair.private, arrayOf(certificate)),
keyProtectionSign)
在那之后,我尝试使用密钥进行签名:
val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)
val privateKey = keyStore.getKey(signatureAlias,null)
val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey)
signature.update(data)
val sign = signature.sign()
但是,行signature.initSign(privateKey)
引发异常:java.security.InvalidKeyException: Supplied key (android.security.keystore.AndroidKeyStoreRSAPrivateKey) is not a RSAPrivateKey instance
如果我没有将密钥导入到Android密钥库中,并尝试对其进行签名,那么它将起作用。
如果我直接在AndroidKeyStore中生成密钥,它也会因相同的错误而失败。
我的代码有什么问题?为什么我不能用我的RSA密钥签名?
答案 0 :(得分:2)
尝试检查此线程中讨论的问题:
https://markmail.org/message/4omngfbqzdq3wk3b#query:+page:1+mid:ne47xbhggf6samib+state:results
不幸的是,充气城堡 JCA Provider有一个错误(http://www.bouncycastle.org/jira/browse/BJA-543 https://www.google.com/url?q=http://www.bouncycastle.org/jira/browse/BJA-543&sa=D&usg=AFQjCNEErNOODYZHHZomGgR1y7NLq2yegw) 向JCA通告在哪里可以处理任何密钥,即使那些密钥 实在无法应付
...
如果必须安装Bouncy Castle JCA Provider,请在下面安装 Android Keystore JCA提供程序。最好的方法是找到 平台捆绑的Bouncy Castle提供程序的安装索引, 然后使用相同的索引调用Security.insertProviderAt 有弹性的城堡提供者。