我正在使用我存储在Android密钥库中的RSA对加密我的应用程序中的数据。
我一直在Play Store中看到NullPointerException
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)
创建密钥对的源代码
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();
然后检索键:
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+的实现工作得很好。
我没有另一个具有相同名称的键,并且我也没有删除该键。
我相信您只是面临Keystore错误。请看这篇文章:Android安全:健忘的密钥库。在Android跟踪器中也有许多与密钥库相关的错误报告,例如更改屏幕锁类型后删除的AndroidKeyStore。
请直接使用KeyStore的getKey方法
private java.security.Key getSecretKey(Context context) throws Exception {
return keyStore.getKey(XEALTH_KEY_ALIAS, null);
}