相关疑难解决方法(0)

UnrecoverableKeyException无法获取有关私钥的信息,KeyStoreException:无效的密钥blob

在我们的应用程序中,我们一直遇到Android Keystore中的数据突然变得无法访问的问题.我们看到的具体例外情况如下:

java.security.UnrecoverableKeyException: Failed to obtain information about private key
 at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:223)
 at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:259)
 at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:269)
 at android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:94)
 at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:474)
 at java.security.KeyStore.getEntry(KeyStore.java:1560)
 at <PACKAGE_NAME>.EncryptionInteractor.generateKeys(EncryptionInteractor.java:104)
 at <PACKAGE_NAME>.EncryptionInteractor.generateKeys(EncryptionInteractor.java:100)
 at <PACKAGE_NAME>.EncryptionInteractor.init(EncryptionInteractor.java:93)
 at <PACKAGE_NAME>.EncryptionInteractor.<init>(EncryptionInteractor.java:80)
 at <PACKAGE_NAME>.EncryptionInteractor.init(EncryptionInteractor.java:65)
 at <PACKAGE_NAME>.<APPLICATION_CLASS>.onCreate(APPLICATION_CLASS.java:17)
 at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1118)
 at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5791)
 at android.app.ActivityThread.-wrap1(Unknown Source:0)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
 at android.os.Handler.dispatchMessage(Handler.java:105)
 at android.os.Looper.loop(Looper.java:164)
 at android.app.ActivityThread.main(ActivityThread.java:6541)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: android.security.KeyStoreException: Invalid key blob
 at android.security.KeyStore.getKeyStoreException(KeyStore.java:695)
 at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:224)
  ... 21 more
Run Code Online (Sandbox Code Playgroud)

我们无法想出一种可靠的方法来重现这个问题.有几篇文章提到了可能导致密钥库"忘记"密钥或被锁定的状态,例如此处.但是,据我所知,我们没有陷入任何这些边缘情况.在首次设置密钥后让设备静置一段时间后,似乎会发生这种情况.我们已经看到这种情况发生在多个仿真器和设备上,范围从21到26.此外,这些设备使用了滑动解锁或PIN.更改PIN或安全方法似乎不会导致此问题.同样,这个问题似乎是在设备未使用几天之后发生的.

我在这里这里找到了另外两个SO 以及一个Google 问题.如果我理解正确,两者相关的答案似乎都依赖于调用者 …

android android-keystore java-security private-key android-security

17
推荐指数
1
解决办法
1295
查看次数

android.security.KeyStoreException:无效的密钥blob

我无法从Android上的KeyStore获取(私人)密钥.问题主要发生在三星设备(S6,S6 Edge)和Android 6上.

android.security.KeyStoreException:无效的密钥blob

调用以下行时抛出(其中别名是商店键的名称).

KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);
Run Code Online (Sandbox Code Playgroud)

KeyStore本身是通过获得的

KeyStore.getInstance("AndroidKeyStore");
Run Code Online (Sandbox Code Playgroud)

密钥由以下方法生成:

private static void createKey(String alias, String subject, KeyStore keyStore, BigInteger serialNumber, Date startDate, Date endDate, String algorithm, String keyStoreProvider, Context context)
            throws KeyStoreException, NoSuchProviderException, NoSuchAlgorithmException, InvalidAlgorithmParameterException {
    if (keyStore.containsAlias(alias)) {
        // Key already exists.
        return;
    }

    // Generate keys.
    KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
            .setAlias(alias)
            .setSubject(new X500Principal(subject))
            .setSerialNumber(serialNumber)
            .setStartDate(startDate)
            .setEndDate(endDate)
            .build();

    KeyPairGenerator generator = KeyPairGenerator.getInstance(algorithm, keyStoreProvider);
    generator.initialize(spec);

    KeyPair keyPair = generator.generateKeyPair();
}
Run Code Online (Sandbox Code Playgroud)

算法是"RSA",keyStoreProvider是"AndroidKeyStore".

stacktrace的一部分:

android.security.KeyStoreException: Invalid key …
Run Code Online (Sandbox Code Playgroud)

security android android-keystore

6
推荐指数
1
解决办法
2856
查看次数

如何重现或解决KeyStoreException?

出现以下描述的崩溃:

由 java.security.UnrecoverableKeyException 引起:无法在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:263) 处获取 X.509 形式的公钥 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java: 303) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:324) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(AndroidKeyStoreProvider.java:388) 在 android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java :105)在java.security.KeyStore.getKey(KeyStore.java:1062)在com.mandarine.sai.sdk.tools.keystore.KeyStoreManager.getKeyPair(KeyStoreManager.java:117)在com.mandarine.sai.sdk。 tools.keystore.KeyStoreManager.deleteKeyPairs(KeyStoreManager.java:222) 位于 com.mandarine.sai.features.authorizations.common.ConnectionKeyBuilderKt.collectConnectionsAndKeys(ConnectionKeyBuilderKt.java:73) 位于 com.mandarine.sai.features.authorizations.common。 ConnectionKeyBuilderKt.collectConnectionsAndKeys(ConnectionKeyBuilderKt.java:41) 在 com.mandarine.sai.features.authorizations.list.AuthorizationsListViewModel.(AuthorizationsListViewModel.java:79) 在 com.mandarine.sai.app.ViewModelsFactory.create(ViewModelsFactory.java:102 )

KeyStoreException:无效的密钥 blob

由 android.security.KeyStoreException 引起:android.security.keystore.getKeyStoreException(KeyStore.java:1301) 处的 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:265) 处的密钥 blob 无效。 AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:303) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:324) 在 android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(AndroidKeyStoreProvider.java:388) 在 android.security.keystore .AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:105) 在 java.security.KeyStore.getKey(KeyStore.java:1062) 在 com.mandarine.sai.sdk.tools.keystore.KeyStoreManager.getKeyPair(KeyStoreManager.java:117) 在com.mandarine.sai.sdk.tools.keystore.KeyStoreManager.deleteKeyPairs(KeyStoreManager.java:222) 位于 com.mandarine.sai.features.authorizations.common.ConnectionKeyBuilderKt.collectConnectionsAndKeys(ConnectionKeyBuilderKt.java:73) 位于 com.mandarine。 sai.features.authorizations.common.ConnectionKeyBuilderKt.collectConnectionsAndKeys(ConnectionKeyBuilderKt.java:41) 在 com.mandarine.sai.features.authorizations.list.AuthorizationsListViewModel.(AuthorizationsListViewModel.java:79) 在 com.mandarine.sai.app.ViewModelsFactory .create(ViewModelsFactory.java:102) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 在 com.mandarine.sai.features.authorizations。 list.AuthorizationsListFragment.setupViewModel(AuthorizationsListFragment.java:119)在com.mandarine.sai.features.authorizations.list.AuthorizationsListFragment.onCreate(AuthorizationsListFragment.java:65)在androidx.fragment.app.Fragment.performCreate(Fragment.java:第2684章)

这是代码:

fun collectConnectionsAndKeys(
    repository: ConnectionsRepositoryAbs,
    keyStoreManager: KeyStoreManagerAbs
): Map<ConnectionID, ConnectionAndKey> {
    return …
Run Code Online (Sandbox Code Playgroud)

crash android kotlin crashlytics

5
推荐指数
1
解决办法
803
查看次数