检索私钥时,链为空

Aes*_*101 34 android android-keystore private-key android-security

我正在使用我存储在Android密钥库中的RSA密钥对加密我的应用程序中的数据.

我一直NullPointerException在Play商店看到s,但我无法重现它们:

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)
Run Code Online (Sandbox Code Playgroud)

创建密钥对的源代码

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();
Run Code Online (Sandbox Code Playgroud)

然后检索密钥:

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);
}
Run Code Online (Sandbox Code Playgroud)

只有当我使用KeyPairGeneratorSpecon API级别19-22 时才会发生这种情况.23+实现工作正常.

没有另一个同名的密钥,我也没有删除密钥.

Mar*_*ski 2

我相信您只是面临密钥库错误。例如,请参阅本文:Android Security: The Forgetful Keystore。Android Tracker 中也有大量与密钥库相关的错误报告,例如更改屏幕锁定类型后 AndroidKeyStore 被删除