У меня есть следующий код для создания хранилища ключей (на 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. Если вы можете указать мне на хороший пример с полным кодом, дайте мне знать.
Грасиас (Спасибо).
Примеры, как здесь: tabnine.com/code/java/methods/java.security.KeyStore/store . Но ответ довольно хорошо объясняет, что мне действительно нужно предоставить пароль, чтобы я мог выполнить нужную перегруженную функцию.




В JavaDoc для KeyStore перечислены две разные перегрузки метода store():
Вы пытаетесь вызвать его только с помощью OutputStream, который не соответствует ни одному варианту.
Вы можете попытаться привести OutputStream к KeyStore.LoadStoreParameter, что потерпит неудачу во время выполнения (поскольку FileOutputStream не реализует KeyStore.LoadStoreParameter).
Или вы можете изменить свой звонок, чтобы добавить пароль (как char[])
Поэтому мне действительно нужно предоставить пароль, чтобы я мог выполнить нужную перегруженную функцию. Поскольку я планировал не использовать какой-либо пароль, я думаю, что использование фиктивного пароля поможет. Спасибо. Кстати, существует ли конкретная реализация Android KeyStore, которая действительно отличается от этой реализации Java?
@CarlosBotero KeyStore — относительно общий класс, который делегирует работу классам KeyStoreSpi (выбирается в зависимости от значения, которое вы используете при вызове KeyStore.getInstance(KeyStore.getDefaultType()) и подобных методов). Я не думаю, что Android изобрел свой собственный KeyStore класс. Однако Android может предоставлять классы KeyStoreSpi, которые не являются частью OpenJDK.
@CarlosBotero: У них есть, к сожалению, название «Хранилище ключей Android», которое представляет собой хранилище ключей с высоким уровнем безопасности, которое может подходить, а может и не подходить для ваших нужд.
...не позволю мне написать команду, которую я видел в других примерах... Какие еще примеры?