java - 如何解决 Android KeyStore 上的“通信失败”问题?
问题描述
我正在使用 Android KeyStore 来存储加密密钥。我最近发现,对于极少数设备(全部是 Android 10),在尝试使用 KeyStore 中包含的密钥解密数据时会产生错误。
初始化密码时出现错误。
val cipher = Cipher.getInstance(TRANSFORMATION)
val spec = GCMParameterSpec(128, Base64.decode(ivString, Base64.NO_WRAP))
cipher.init(Cipher.DECRYPT_MODE, getSecretKey(), spec) // Here I get the error.
哪里getSecretKey()
是:
@Throws(NoSuchAlgorithmException::class, UnrecoverableEntryException::class, KeyStoreException::class)
private fun getSecretKey(): SecretKey {
return (keyStore.getEntry(ALIAS, null) as KeyStore.SecretKeyEntry).secretKey
}
我得到的错误是:
android.security.keystore.KeyStoreConnectException
Failed to communicate with keystore service
android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized (AndroidKeyStoreCipherSpiBase.java:256)
android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit (AndroidKeyStoreCipherSpiBase.java:148)
javax.crypto.Cipher.tryTransformWithProvider (Cipher.java:2980)
javax.crypto.Cipher.tryCombinations (Cipher.java:2891)
javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider (Cipher.java:2796)
javax.crypto.Cipher.chooseProvider (Cipher.java:773)
javax.crypto.Cipher.init (Cipher.java:1288)
javax.crypto.Cipher.init (Cipher.java:1223)
mypackage.data.source.pass.storage.security.AesDecryptor.decryptData (AesDecryptor.kt:42)
AndroidKeyStoreCipherSpiBase.java
查看我看到的代码, 失败与mKeyStore.begin()
返回有关null
。
OperationResult opResult = mKeyStore.begin(
mKey.getAlias(),
purpose,
true, // permit aborting this operation if keystore runs out of resources
keymasterInputArgs,
additionalEntropy,
mKey.getUid());
if (opResult == null) {
throw new KeyStoreConnectException(); // LINE 256. This exception is thrown
}
有任何想法吗?
注意:一个有趣的细节是目前我们正在后台线程中获取密钥。在它出现在主线程之前,我们从未遇到过问题(即使我们没有大的统计数据)。
解决方案
不幸的是,这似乎是 Android 10 中的一个错误。https://issuetracker.google.com/issues/152240028 https://issuetracker.google.com/issues/147384380
谷歌工程师正在研究它。
推荐阅读
- php - PHP使用目录字符串上传文件
- c++ - 我的有效表达式检查器中的扭结
- r - R studio 服务器浏览器在登录时冻结
- android - 无法在 android oreo 上从 Gmail 安装 xamarin forms apk,因为它说“解析包时出错”
- c++ - 从地图复制到指针列表
- syntax-error - 在 ocaml 中出现语法错误
- javascript - AutoPostBack 恢复我对事件 onChange 所做的更改。ASP.NET
- javascript - discord.js:将用户名添加到字符串的问题
- node.js - 获取用户 ID 时遇到问题
- python - Python:不明白为什么在 GUI“command=”中需要 lambda 来调用函数