【问题标题】:Can't sign with imported to AndroidKeyStore RSA Private key无法使用导入到 Android KeyStore RSA 私钥进行签名
【发布时间】:2019-12-02 00:03:28
【问题描述】:

我正在尝试使用导入的密钥库密钥来签署一段数据:

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

【问题讨论】:

  • keyStore.load(null) 似乎有问题。这通常应该是一个输入流。
  • 这实际上是唯一允许的设置
  • 我不这么认为。为什么方法只能接受null 作为参数?
  • 因为我使用的具体实现(AndroidKeyStore)如果你尝试传递参数会抛出异常
  • 假设设备上的密钥库,这可能在密钥库类型之间确实有所不同。

标签: android kotlin rsa signing android-keystore


【解决方案1】:

尝试查看此线程中讨论的问题:

https://markmail.org/message/4omngfbqzdq3wk3b#query:+page:1+mid:ne47xbhggf6samib+state:results

不幸的是,充气城堡 JCA 提供程序有一个错误 (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) where is 向 JCA 通告它可以处理任何密钥,甚至是它自己的密钥 其实处理不了

...

如果您必须安装 Bouncy Castle JCA Provider,请在下方安装 Android 密钥库 JCA 提供程序。实现这一目标的最佳方法是找到 安装平台捆绑的 Bouncy Castle 提供程序的索引, 然后使用相同的索引和您的调用 Security.insertProviderAt 充气城堡供应商。

【讨论】:

  • 那么:OP 的问题是她在 Android KeyStore 提供程序之前安装了 bouncycastle 提供程序?
  • 是的,这就是问题所在。要真正解决问题,我首先运行删除提供程序,然后在最后添加提供程序
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 2012-07-15
  • 2023-04-02
  • 2020-03-20
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多