сериализация зашифрованных объектов на Android, не может загрузить из файла - PullRequest
0 голосов
/ 03 мая 2018

Во-первых. Никогда не размещал здесь раньше, извините, если я нарушаю какие-либо правила!

Я пытаюсь создать приложение для Android, которое сериализует запечатанный объект класса, который содержит массив файлов (вроде как зашифрованный том).

Мне удалось создать файл, но по какой-то причине не удается загрузить из него данные. Не знаю, чем сериализация Android отличается от обычных настольных приложений, и каждый раз, когда я гугляю, как это сделать, я получаю ссылки на посты несколько лет назад.

При запуске приложения я проверяю, существует ли файл, если нет, то создайте его. Примечание: эта часть очень схематична, так как предназначена для быстрого тестирования самого приложения, изменит его в будущем. Вот как это выглядит:

if (!Files.exists(Paths.get("android.resource://" + getPackageName() + "/vault.vlt")))

Для создания файла:

    final Cipher cipher = generateCipher();

    final FileOutputStream fileOutputStream = openFileOutput("vault.vlt",
            MODE_PRIVATE);
    final CipherOutputStream cipherOutputStream = new CipherOutputStream(fileOutputStream, cipher);
    final ObjectOutputStream objectOutputStream = new ObjectOutputStream(cipherOutputStream);

    objectOutputStream.writeObject(Core.getVault());
    objectOutputStream.close();

    Toast.makeText(this,"Saved",Toast.LENGTH_SHORT).show();

Чтобы загрузить файл:

    final Cipher cipher = generateCipher();

    final FileInputStream fileInputStream = openFileInput("vault.vlt");
    final CipherInputStream cipherInputStream = new CipherInputStream(fileInputStream, cipher);
    final ObjectInputStream objectInputStream = new ObjectInputStream(cipherInputStream);

    Core.setVault((Vault) objectInputStream.readObject());
    objectInputStream.close();

    Toast.makeText(this,Core.getVault().apples,Toast.LENGTH_SHORT).show();

И вот как выглядит мой метод генерации шифра с использованием Guava:

    // key size
    final byte keySize = 32; // 256

    // Hashing
    final String hash =
            Hashing.sha256()
                    .hashString(Core.getVault().getPassword(), Charsets.UTF_8)
                    .toString().substring(0, keySize);

    // Creating keys
    final byte[] key = hash.getBytes();
    final String transformation = "AES";
    final SecretKeySpec secretKeySpec = new SecretKeySpec(key, transformation);

    // Creating cipher
    @SuppressLint("GetInstance") final Cipher cipher = Cipher.getInstance(transformation);
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
    return cipher;

А вот и след из моей ошибки:

W/System.err: java.io.StreamCorruptedException: invalid stream header: 02FD0D3D
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:302)
        at theredspy15.vault115.EntranceActivity.loadVault(EntranceActivity.java:70)
        at theredspy15.vault115.EntranceActivity.enter(EntranceActivity.java:41)
        at java.lang.reflect.Method.invoke(Native Method)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
        at android.view.View.performClick(View.java:6256)
        at android.view.View$PerformClick.run(View.java:24701)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

1 Ответ

0 голосов
/ 04 мая 2018

Вам нужно поместить Cipher в DECRYPT_MODE при чтении из файла.

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