java - 如何解决 Android KeyStore 上的 "communication failure"?

标签 java android kotlin encryption android-keystore

我正在使用 Android KeyStore 来存储加密 key 。我最近发现,对于极少数设备(全部是 Android 10),在尝试使用 KeyStore 中包含的 key 解密数据时会产生错误。
初始化密码时出现错误。

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
        }
有任何想法吗?
注意:一个有趣的细节是目前我们正在后台线程中获取 key 。在它出现在主线程之前,我们从未遇到过问题(即使我们没有大的统计数据)。

最佳答案

不幸的是,这似乎是 Android 10 中的一个错误。https://issuetracker.google.com/issues/152240028
https://issuetracker.google.com/issues/147384380
谷歌工程师正在研究它。

关于java - 如何解决 Android KeyStore 上的 "communication failure"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62674630/

相关文章:

android - 如何获取手机上所有已安装的应用程序?

java - 将 $addToset 与 java morphia 聚合一起使用

java - 如何从Session中保存和读取数据?

java - groovy 有日期文字吗?

android - 如何保护 android 中的 http 数据(安全 token )?

android - 膨胀类 android.support.v7.widget.AppCompatEditText 时出错

java - 在android中显示布局1在左边,布局2在右边

java - 无法在 Windows 7 64 位上安装 LuaEclipse

android - 带有 Kotlin 的 Android Studio 中相关 XML 文件的多个装订线图标

java - 如何根据感兴趣区域周围的设计去除图像的背景?