KeyStore.store((KeyStore.LoadStoreParameter) FileOutputStream) 在 Android 加密模块中抛出“无法转换”错误

问题描述 投票:0回答:1

我有以下代码来生成一个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 的实现。如果您能给我提供一个带有完整代码的好示例,请告诉我。

谢谢(谢谢)。

java android cryptography keystore secret-key
1个回答
0
投票

KeyStore

JavaDoc 列出了 
store()
方法的两种不同重载:

您尝试仅使用与两个变体都不匹配的

OutputStream
来调用它。

您可以尝试将

OutputStream
转换为
KeyStore.LoadStoreParameter
,这将在运行时失败(因为
FileOutputStream
未实现
KeyStore.LoadStoreParameter
)。

或者您可以更改您的通话以添加密码(如

char[]

© www.soinside.com 2019 - 2024. All rights reserved.