无法使用导入到AndroidKeyStore的RSA签名进行签名

时间:2019-12-02 00:03:28

标签: android kotlin rsa signing android-keystore

我正在尝试使用导入的密钥库密钥对一段数据进行签名:

我的密钥首先在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密钥签名?

1 个答案:

答案 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   有弹性的城堡提供者。