android.security.KeyStoreException: Invalid key blob

后端 未结 1 1108
粉色の甜心
粉色の甜心 2020-12-11 04:35

I cannot obtain a (private) key from KeyStore on Android. Problem occurs mainly on Samsung devices (S6, S6 Edge) and Android 6.

android.security.KeyStoreExce

相关标签:
1条回答
  • 2020-12-11 05:13

    This problem is occurred when user tries to UNLOCK from LOCK/UNINITIALIZED. It is by default defined as 30 secs for timing. This problem is it's API related implementation issue.

    This error is generated from InvalidKeyException. By bypassing this exception and call the method again, you can get rid of this error.

    You have to remove the InvalidKeyException class from the catch argument. This will still allow you to check for InvalidKeyException. After checking you have to try for second time with code so that the problem is not shown in eye but doing 2 times checking it may solve your issue. Code is given below.

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

    You can see my another answer that describes one by one occurring issue and solution.

    UPDATE from @Ankis:

    As you solved the issue by changing InvalidKeyException to UnrecoverableKeyException. So I have updated as per your suggestion so that world can know the actual answer. Thanks for sharing :).

    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;
    }
    
    0 讨论(0)
提交回复
热议问题