我正在关注本教程:如何使用 Android Keystore 存储密码和其他敏感信息。它(松散地)与 Google 示例应用程序相关联:BasicAndroidKeyStore。
我可以使用公钥加密我的数据,也可以在运行 Lollipop 的设备上解密。但是我有一个运行棉花糖的 Nexus 6,这会崩溃并给出错误:
java.lang.RuntimeException: Unable to create application com.android.test: java.lang.ClassCastException: android.security.keystore.AndroidKeyStoreRSAPrivateKey cannot be cast to java.security.interfaces.RSAPrivateKey
这是它崩溃的代码:
KeyStore.Entry entry;
//Get Android KeyStore
ks = KeyStore.getInstance(KeystoreHelper.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
// Weird artifact of Java API. If you don't have an InputStream to load, you still need to call "load", or it'll crash.
ks.load(null);
// Load the key pair from the Android Key Store
entry = ks.getEntry(mAlias, null);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) entry;
//ERROR OCCURS HERE::
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey();
Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
output.init(Cipher.DECRYPT_MODE, rsaPrivateKey);
我不愿意将其归结为 Android M 的怪异之处,因为我认为 java 加密库没有改变的原因。如果 M 版本发布并且我们的应用程序立即在 M 上崩溃,我将遇到大麻烦。
我做错了什么?该错误非常明确地表明您无法转换为 RSAPrivateKey,那么有没有人知道从条目中获取 RSAPrivateKey 的更好方法?
非常感谢。