【问题标题】:How to address "communication failure" on Android KeyStore?如何解决 Android KeyStore 上的“通信失败”问题?
【发布时间】:2020-10-21 18:30:21
【问题描述】:

我正在使用 Android KeyStore 来存储加密密钥。我最近发现,在尝试使用 KeyStore 中包含的密钥解密数据时,很少有设备(全部是 Android 10)会产生错误。

初始化密码时出现错误。

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
        }

有什么想法吗?

注意:一个有趣的细节是目前我们正在后台线程中获取密钥。在它出现在主线程之前,我们从未遇到过问题(即使我们没有大的统计数据)。

【问题讨论】:

  • 鉴于您的注意,这很可能是多线程的问题。该错误提到缺乏初始化。也许您在后台线程完成初始化之前使用了该值?我认为这个问题的上下文太少了。
  • @Fureeish 初始化是在构造函数中完成的,所以当我访问它时不能不初始化init { initKeyStore() }
  • @Fureeish 似乎该问题与 Android 10 中的错误有关:issuetracker.google.com/issues/147384380 与多线程有关,但在我的实现中不是错误

标签: java android kotlin encryption android-keystore


【解决方案1】:

不幸的是,这似乎是 Android 10 中的一个错误。https://issuetracker.google.com/issues/152240028 https://issuetracker.google.com/issues/147384380

Google 工程师正在研究它。

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 2020-09-28
    • 2016-05-06
    • 2016-10-10
    • 2019-07-07
    • 2013-10-07
    • 1970-01-01
    • 2014-05-26
    • 2019-10-23
    相关资源
    最近更新 更多