我正在使用存储在Android keystore 中的RSA key 对对应用程序中的数据进行加密。

我在Play商店中看到过NullPointerException,但无法复制它们:

java.lang.NullPointerException: chain == null
    at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:1205)
    at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:374)
    at java.security.KeyStore.getEntry(KeyStore.java:644)
    at MyClass.getKeyStoreEntry(MyClass.java:111)

创建 key 对的源代码
Calendar start = Calendar.getInstance();
start.setTimeInMillis(0);
Calendar end = Calendar.getInstance();
end.set(Calendar.YEAR, 3000);

KeyPairGeneratorSpec.Builder keySpecBuilder = new KeyPairGeneratorSpec.Builder(context)
    .setAlias(keyName)
    .setSubject(new X500Principal("CN=" + keyName))
    .setSerialNumber(BigInteger.TEN)
    .setStartDate(start.getTime())
    .setEndDate(end.getTime())
    .setKeySize(RSA_KEY_SIZE);

KeyPairGeneratorSpec spec = keySpecBuilder.build();
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
gen.initialize(spec);
gen.generateKeyPair();

然后检索 key :
private KeyStore.PrivateKeyEntry getKeyStoreEntry() {
    KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
    keyStore.load(null);

    if (!keyStore.containsAlias(keyName)) {
        throw new KeyNotFoundException();
    }
    return (KeyStore.PrivateKeyEntry) keyStore.getEntry(keyName, null);
}

这仅在我使用API​​级别19-22上的KeyPairGeneratorSpec时发生。 23+的实现效果很好。

do not have another key with the same name,但我也没有deleted the key

最佳答案

我相信您只是面对Keystore错误。例如,请参见此文章:Android Security: The Forgetful Keystore。 Android追踪器中也有许多与keystore相关的错误报告,例如AndroidKeyStore deleted after changing screen lock type

关于android - 检索私钥时链为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39119848/

10-10 18:15
查看更多