Как можно сериализовать объект (скажем, HashMap) без использования файлов? - PullRequest
0 голосов
/ 13 января 2020

Проблема:

В настоящее время я пишу приложение для Android API уровня 19 (да, я знаю, что оно довольно старое). У меня проблема с сериализацией данных настроек. Частично проблема заключается в том, что некоторые данные являются конфиденциальными и должны быть зашифрованы перед записью на диск. Таким образом, существует смесь зашифрованных и незашифрованных данных. Данные состоят из int, Boolean, String, byte [] и других типов.

Для тех, кому интересно, при запуске приложения пользователь должен ввести свой PIN-код. ПИН-код запускается по алгоритму ha sh несколько раз. В середине цикла они получают криптографический ключ и затем хэширование l oop завершается. Таким образом, промежуточный результат является ключевым, а окончательный результат - проверкой. Проверка записывается в файл настроек, а ключ используется для шифрования или дешифрования конфиденциальных данных. Существуют и другие средства защиты, но это работает в двух словах.

Большинство обнаруженных мной реализаций используют HashMap и ObjectOutputStream, которые нельзя использовать из-за проблемы криптографии (согласно примерам, которые Я видел до сих пор). Я встречал класс Data в Android документации разработчика, но Android Studio говорит, что для использования ему требуется API 29.

Исследование:

I нашел довольно много ответов в разных местах, таких как:

Надежно преобразовать любой объект в строку, а затем обратно

https://developer.android.com/reference/androidx/work/Data

https://beginnersbook.com/2013/12/how-to-serialize-hashmap-in-java/

HashMap не сериализуем

https://developer.android.com/guide/topics/security/cryptography#java

... и многие другие, но я не могу их использовать из-за того, что я пытаюсь сделать.

Ответы [ 2 ]

1 голос
/ 13 января 2020

Ответ на специально заданный вами вопрос:

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  ObjectOuputStream oos = new ObjectOuputStream(baos);

  oos.writeObject(someObject);
  oos.close();

  byte[] serialized = baos.toByteArray();

Это сериализуется в байтовый массив. Файлы не используются. Затем вы можете зашифровать сериализацию перед записью ... используя любую схему шифрования, которую вы выберете.

Однако, лучшая идея состоит в том, чтобы поместить шифрование в выходной конвейер; например,

  FileOutputStream fos = new FileOutputStream(path);
  Cipher c = ...
  CipherOutputStream cos = new CipherOutputStream(fos, c);
  ObjectOuputStream oos = new ObjectOuputStream(baos);

  oos.writeObject(someObject);
  oos.close();

Сериализация будет зашифрована перед записью в файловую систему.

0 голосов
/ 13 января 2020

Вы можете записывать и читать ваши данные с помощью cipheroutputstream Как правильно использовать CipherOutputStream для шифрования и дешифрования журнала, созданного с помощью log4j (RollingFileAppender) . ObjectInputStream с зависанием CipherInputStream, зависание

CipherOutputStream зашифровывает данные для вас. Вы можете расшифровать его с помощью CipherInputStream.

Вы должны поместить cipheroutputstream между вашим потоком объектов и потоком файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...