如果我在Android 9上运行此代码,则会收到以下异常:
private static KeyStore.PrivateKeyEntry getPrivateKeyEntry(String alias) {
try {
KeyStore ks = KeyStore
.getInstance(SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);
if (entry == null) {
Log.w(TAG, "No key found under alias: " + alias);
Log.w(TAG, "Exiting signData()...");
return null;
}
if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
Log.w(TAG, "Not an instance of a PrivateKeyEntry");
Log.w(TAG, "Exiting signData()...");
return null;
}
return (KeyStore.PrivateKeyEntry) entry;
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
return null;
}
}
例外:
在android.os.Parcel.readException的android.os.Parcel.readException(Parcel.java:1910)的android.os.Parcel.createException(Parcel.java:1956)上的KeyStore异常android.os.ServiceSpecificException :(代码7) (Parcel.java:1860)位于android.security.keynd.KandStoreStoreSpi的android.security.IKeystoreService $ Stub $ Proxy.get(IKeystoreService.java:786)android.security.KeyStore.get(KeyStore.java:195)。 engineGetCertificateChain(AndroidKeyStoreSpi.java:118)at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:484)at java.security.KeyStore.getEntry(KeyStore.java:1560)at com.phenodev.testenc.KeyStoreHelper.getPrivateKeyEntry(KeyStoreHelper) .java:151)com.phenodev.testenc.KeyStoreHelper.encrypt(KeyStoreHelper.java:173)at com.phenodev.testenc.KeyStoreEncryptor.encrypt(KeyStoreEncryptor.java:19)
请帮忙解决它。
最后我找到了解决方案。看起来好像Android P (KeyStore.PrivateKeyEntry) keyStore.getEntry("alias", null)
不是获取私钥的正确方法。
通过这种方式访问私钥/公钥,我能够摆脱这个警告
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", null);
PublicKey publicKey = keyStore.getCertificate("alias").getPublicKey();
我从AndroidKeyStore
检索一个不对称的密钥时遇到了同样的问题
我的解决方案基于Dr Glass获取密钥的答案如下:(aliasKey是你的别名字符串)
公钥:
val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)
val asymmetricKeyPublicKey = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
keyStore.getCertificate(aliasKey).publicKey
} else {
val asymmetricKey = keyStore.getEntry(aliasKey, null) as KeyStore.PrivateKeyEntry
asymmetricKey.certificate.publicKey
}
专用密钥:
val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)
val asymmetricKeyPrivateKey = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
keyStore.getKey(aliasKey, null) as PrivateKey
} else {
val asymmetricKey = keyStore.getEntry(aliasKey, null) as KeyStore.PrivateKeyEntry
asymmetricKey.privateKey
}
使用此代码,我在使用Android P的模拟器和/或设备中没有任何警告