Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决;“通信故障”;安卓密钥库?_Java_Android_Kotlin_Encryption_Android Keystore - Fatal编程技术网

Java 如何解决;“通信故障”;安卓密钥库?

Java 如何解决;“通信故障”;安卓密钥库?,java,android,kotlin,encryption,android-keystore,Java,Android,Kotlin,Encryption,Android Keystore,我正在使用Android密钥库来存储加密密钥。我最近发现,在尝试使用密钥库中包含的密钥解密数据时,很少有设备(都是Android 10)会产生错误 初始化密码时出现错误 val cipher = Cipher.getInstance(TRANSFORMATION) val spec = GCMParameterSpec(128, Base64.decode(ivString, Base64.NO_WRAP)) cipher.init(Cipher.DECRYPT_MODE, getSecretK

我正在使用Android密钥库来存储加密密钥。我最近发现,在尝试使用密钥库中包含的密钥解密数据时,很少有设备(都是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)
查看
androidkeystrecipherspibase.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
        }
有什么想法吗


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

不幸的是,这似乎是安卓10中的一个bug。


谷歌工程师正在研究它。

不幸的是,它似乎是安卓10中的一个bug。


谷歌工程师正在研究它。

根据您的说明,这很可能是多线程的问题。该错误提到缺少初始化。可能是在后台线程完成初始化之前使用了该值?我认为问题中的上下文太少。@Fureeish初始化是在构造函数中完成的,因此当我访问它时,它不能不初始化。
init{initKeyStore()}
@Fureeish似乎问题与Android 10中的一个bug有关:它与多线程有关,但在我的实现上并不是一个错误。请注意,这很可能是多线程的问题。该错误提到缺少初始化。可能是在后台线程完成初始化之前使用了该值?我认为这个问题的上下文太少了。@Fureeish初始化是在构造函数中完成的,因此当我访问它时,它不能不初始化
init{initKeyStore()}
@Fureeish似乎这个问题与安卓10中的一个bug有关:它与多线程有关,但不是我实现中的错误