我有以下代码来生成一个KeyStore(用Java?)并将其保存在当前物理Android设备的内部存储器中:
KeyStore keyStore;
try {
keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
} catch (KeyStoreException e) {
e.printStackTrace();
return;
}
try {
FileInputStream fileInputStream = thisClass_Context.getApplicationContext().openFileInput("Subs2IPA_Crypto.keystore");
} catch (FileNotFoundException e) {
e.printStackTrace();
try {
keyStore.load(null);
FileOutputStream fileOutputStream = thisClass_Context.openFileOutput("Subs2IPA_Crypto.keystore", Context.MODE_PRIVATE);
keyStore.store((KeyStore.LoadStoreParameter) fileOutputStream);
fileOutputStream.close();
Android Studio 不会让我编写我在其他示例中看到的命令来存储 KeyStore:
keyStore.store(fileOutputStream);
这会抛出一个错误,指出参数必须是以下类型:LoadStoreParameter,并提供了转换为该类型的解决方案:
keyStore.store((KeyStore.LoadStoreParameter) fileOutputStream);
但是,如果我实际上使用该代码运行应用程序,它就会从同一行抛出一个错误,指出它无法转换为建议的类型:
java.lang.ClassCastException: java.io.FileInputStream cannot be cast to java.security.KeyStore$LoadStoreParameter
如果我运行类似的命令也会生成此错误:
keyStore.load((KeyStore.LoadStoreParameter) fileInputStream);
这里肯定缺少一些东西,但我找不到具有替代代码实现的代码示例。我该如何解决这个问题?
另外,我也很好奇。有人建议我应该只实现 Android KeyStore 而不是 Java KeyStore。我不知道他们实际上是不同的!我显然需要的是 Android KeyStore 的实现。如果您能给我提供一个带有完整代码的好示例,请告诉我。
谢谢(谢谢)。
store()
方法的两种不同重载:
您尝试仅使用与两个变体都不匹配的
OutputStream
来调用它。
您可以尝试将
OutputStream
转换为 KeyStore.LoadStoreParameter
,这将在运行时失败(因为 FileOutputStream
未实现 KeyStore.LoadStoreParameter
)。
或者您可以更改您的通话以添加密码(如
char[]
)