小编dar*_*sds的帖子

cipher.init 上的 Android 密钥库操作失败

在我的 Android 应用程序中,我将一个项目插入到 KeyStore 中,偶尔我会遇到与InvalidKeyException: Keystore operation failed/相关的崩溃KeyStoreException: Key not found。通常操作会成功,但总体上有大约 10% 的失败率。我认为这可能是一种竞争条件,即 cipher.init 将在密钥创建完成之前发生,但我不确定。关于为什么此代码偶尔会失败或如何解决的任何想法?

下面是错误:

    java.lang.Error: java.security.InvalidKeyException: Keystore operation failed
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1173)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.security.InvalidKeyException: Keystore operation failed
        at android.security.KeyStore.getInvalidKeyException(KeyStore.java:901)
        at android.security.KeyStore.getInvalidKeyException(KeyStore.java:926)
        at android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54)
        at android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89)
        at android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:265)
        at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:109)
        at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2984)
        at javax.crypto.Cipher.tryCombinations(Cipher.java:2891)
        at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2796)
        at javax.crypto.Cipher.chooseProvider(Cipher.java:773)
        at javax.crypto.Cipher.init(Cipher.java:1143)
        at javax.crypto.Cipher.init(Cipher.java:1084)
        at com.myapp.service.KeyStoreService.createKeysAndEncrypt(KeyStoreService.kt:32)
        at com.myapp.provision.ProvisionPresenter.createKeysAndEncrypt(ProvisionRepository.kt:26)
        at com.myapp.provision.ProvisionPresenter.certRetrieved(ProvisionPresenter.kt:106)
        at com.myapp.provision.ProvisionPresenter.access$certRetrieved(ProvisionPresenter.kt:17)
        at com.myapp.provision.ProvisionPresenter$postCompleted$1.invoke(ProvisionPresenter.kt:88)
        at com.myapp.provision.ProvisionPresenter$postCompleted$1.invoke(ProvisionPresenter.kt:17)
        at com.myapp.service.NetworkingService$getData$1.onResponse(NetworkingService.kt:110)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:153)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at …
Run Code Online (Sandbox Code Playgroud)

encryption android keystore android-keystore

5
推荐指数
0
解决办法
381
查看次数

如何在主线程上的 onCreate/ 中获取房间列表的大小?

如何轻松获得数据库大小的计数,以便我可以根据数据库是否为空执行适当的操作?

我有一个 App DB、视图模型、存储库、Dao 和所有其他部分,并且我的对象插入......但我无法调用onCreate()数据库中列表的大小。当我尝试获取mAppDatabase.vehicleDao().getAll().getValue().size(), 或 时mVehicleViewModel.getAll().getValue().size(),我得到空指针异常。

但是我知道我的对象正在插入,因为当我运行一个 observable 时,我可以记录它们的信息......但我无法在主线程/onCreate 中获得计数。帮助!示例代码如下:

protected void onCreate(Bundle savedInstanceState) {
...
mAppDatabase = AppDatabase.getInstance(MyActivity.this);
Log.d("LISTSIZEAPP", String.valueOf(mAppDatabase.myDao().getAll().getValue().size()));
ObserveItems();
Run Code Online (Sandbox Code Playgroud)

或者

protected void onCreate(Bundle savedInstanceState) {
...
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Log.d("LISTSIZEVM",  String.valueOf(mViewModel.getAll().getValue().size()));
ObserveItems();
Run Code Online (Sandbox Code Playgroud)

^ 两者的空指针异常(尝试在空对象引用上调用接口方法 'java.lang.Object[] java.util.List.toArray()')...

然而:

private void ObserveItems() {
    mViewModel.getAll().observe(this, new Observer<List<Foo>>() {
        @Override
        public void onChanged(@Nullable final List<Foo> foos) {
            mFoos= foos;
            for (Vehicle v: mFoos) {
                Log.d("ROOM INFO - FOOS", v.getFooTitle());
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我可以记录我想要的所有信息。所以这些项目是明确插入的。是什么赋予了?我错过了什么?谢谢你。

java android android-room android-architecture-components android-jetpack

3
推荐指数
1
解决办法
6139
查看次数