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

时间:2016-04-07 22:19:33

标签: android security android-keystore

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

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

调用以下行时抛出

(别名是商店键的名称)。

KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);

KeyStore本身是通过

获得的
KeyStore.getInstance("AndroidKeyStore");

密钥由以下方法生成:

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();
}

算法是" RSA"和keyStoreProvider是" AndroidKeyStore"。

stacktrace的一部分:

android.security.KeyStoreException: Invalid key blob
       at android.security.KeyStore.getKeyStoreException(KeyStore.java:939)
       at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:216)
       at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:252)
       at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:263)
       at android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:93)
       at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:372)
       at java.security.KeyStore.getEntry(KeyStore.java:645)

异常导致 java.security.UnrecoverableKeyException:无法获取有关要抛出的私钥的信息。

我无法找到关于"无效密钥blob"的更详细信息, 仅在此处定义了消息本身:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/security/keymaster/KeymasterDefs.java

1 个答案:

答案 0 :(得分:1)

当用户从UNLOCK尝试LOCK/UNINITIALIZED时,会发生此问题。默认情况下,它定义为30 secs此问题是与API相关的实施问题。

此错误由InvalidKeyException生成。通过绕过此异常并再次调用该方法,您可以摆脱此错误。

您必须从catch参数中删除InvalidKeyException类。这仍然允许您检查InvalidKeyException。检查后你必须第二次尝试使用代码,以便问题不会显示在眼睛中,但做2次检查可能会解决您的问题。代码如下。

try {
    KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) this.keyStore
            .getEntry("alias", null);

} catch (InvalidKeyException ex) {
    ex.printStackTrace();
    if (ex instanceof InvalidKeyException) { // bypass
                                                // InvalidKeyException
        // You can again call the method and make a counter for deadlock
        // situation or implement your own code according to your
        // situation
        if (retry) {
            keyStore.deleteEntry(keyName);
            return getCypher(keyName, false);
        } else {
            throw ex;
        }
    }
} catch (final Exception e) {
    e.printStackTrace();
    throw e;
}
  

你可以看到我的另一个answer逐一描述   问题和解决方案。

@Ankis更新:

通过将InvalidKeyException更改为UnrecoverableKeyException来解决问题。所以我根据你的建议进行了更新,以便世界可以知道实际的答案。感谢分享:)。

try {
    KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) this.keyStore
            .getEntry("alias", null);

} catch (UnrecoverableKeyException ex) {
    ex.printStackTrace();
        // You can again call the method and make a counter for deadlock
        // situation or implement your own code according to your
        // situation
        if (retry) {
            keyStore.deleteEntry(keyName);
            return getCypher(keyName, false);
        }
} catch (final Exception e) {
    e.printStackTrace();
    throw e;
}
相关问题