如何在Android 10上解决KeyStoreConnectException?

7

我的应用程序在除Android 10以外的所有Android操作系统上都运行得很好。我正在使用更新为Android 10的Motorola One Power设备。我们正在使用Android Keystore加密数据库。

应用程序在启动时崩溃,出现以下错误:

android.security.keystore.KeyStoreConnectException: 无法与密钥库服务通信 at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:256) at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:148) at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2980)

这是一个KeyStoreConnectException问题。应用程序需要时间连接到KeyStoreConnectException。

注意:如果我在调试模式下运行应用程序,则它可以正常工作。

请帮我找到解决方案。谢谢。


我遇到了同样的问题,我发现只有在后台线程上使用密码时才会出现这种情况。如果我在主线程上执行它,它就可以正常工作。 你找到了解决方法吗? - Logain
我在主线程上使用它,但仍然在Crashlytics中收到此错误。 - Mladen Rakonjac
1
你解决了这个 bug 吗? - WillEllis
3个回答

4
正如MatPag所指出的那样,这是Android 10中的已知错误,在早期或后续版本中不存在。由于我在多个地方调用Cipher::init(),因此在这里提供了一个方便的Kotlin包装函数:
private fun keyStoreWorkaroundForAndroid10(f: () -> Unit) {
    for (i in 0..3) {
        try {
            f()
            return
        } catch (e: ProviderException) {
            Timber.d("Applying Android 10 KeyStoreConnectException bug workaround. Counter: ${i}, Exception: ${e.message}")
            Thread.sleep(100)
            continue
        }
    }
}

然后你可以像这样调用它(记住 - 在后台线程中):

keyStoreWorkaroundForAndroid10 {
    cipherEncrypt.init(Cipher.ENCRYPT_MODE, publicKey)
}

0

这是一个已知的 bug,跟踪链接在此 https://issuetracker.google.com/issues/147384380

Google 已经修复了它,可能会在 Android 11 中提供。

我们目前不知道它是否会在某个时候通过安全补丁在 Android 10 上得到修复。


仍然存在这个 bug 在 Android 12 和 Android 13 中。 - Wackaloon

-1

我认为你的代码运行时间很长,你可以将其移动到线程中,试试看!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接