【发布时间】: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