KeyStore.store((KeyStore.LoadStoreParameter) FileOutputStream) выдает ошибку «невозможно привести» в модуле шифрования Android

У меня есть следующий код для создания хранилища ключей (на 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, а не Java. Я и не знала, что они на самом деле разные!!! Что мне, очевидно, нужно, так это реализация Android KeyStore. Если вы можете указать мне на хороший пример с полным кодом, дайте мне знать.

Грасиас (Спасибо).

...не позволю мне написать команду, которую я видел в других примерах... Какие еще примеры?

President James K. Polk 02.05.2024 16:50

Примеры, как здесь: tabnine.com/code/java/methods/java.security.KeyStore/store . Но ответ довольно хорошо объясняет, что мне действительно нужно предоставить пароль, чтобы я мог выполнить нужную перегруженную функцию.

Carlos Botero 02.05.2024 17:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В JavaDoc для KeyStore перечислены две разные перегрузки метода store():

Вы пытаетесь вызвать его только с помощью OutputStream, который не соответствует ни одному варианту.

Вы можете попытаться привести OutputStream к KeyStore.LoadStoreParameter, что потерпит неудачу во время выполнения (поскольку FileOutputStream не реализует KeyStore.LoadStoreParameter).

Или вы можете изменить свой звонок, чтобы добавить пароль (как char[])

Поэтому мне действительно нужно предоставить пароль, чтобы я мог выполнить нужную перегруженную функцию. Поскольку я планировал не использовать какой-либо пароль, я думаю, что использование фиктивного пароля поможет. Спасибо. Кстати, существует ли конкретная реализация Android KeyStore, которая действительно отличается от этой реализации Java?

Carlos Botero 02.05.2024 17:43

@CarlosBotero KeyStore — относительно общий класс, который делегирует работу классам KeyStoreSpi (выбирается в зависимости от значения, которое вы используете при вызове KeyStore.getInstance(KeyStore.getDefaultType()) и подобных методов). Я не думаю, что Android изобрел свой собственный KeyStore класс. Однако Android может предоставлять классы KeyStoreSpi, которые не являются частью OpenJDK.

Thomas Kläger 02.05.2024 19:58

@CarlosBotero: У них есть, к сожалению, название «Хранилище ключей Android», которое представляет собой хранилище ключей с высоким уровнем безопасности, которое может подходить, а может и не подходить для ваших нужд.

President James K. Polk 03.05.2024 03:10

Другие вопросы по теме