Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android上的加密对象序列化,无法从文件加载_Java_Android_File_Serialization_Loading - Fatal编程技术网

Java android上的加密对象序列化,无法从文件加载

Java android上的加密对象序列化,无法从文件加载,java,android,file,serialization,loading,Java,Android,File,Serialization,Loading,首先。以前从未在这里发布过,如果我违反任何规则,请道歉 我正在尝试为android制作一个应用程序,它序列化一个类的密封对象,该类包含一个文件数组(类似于加密卷) 我已成功创建了该文件,但由于某些原因无法从中加载数据。我不知道android序列化与普通桌面应用程序有何不同,每次我在谷歌上搜索如何做,我都会得到几年前的帖子链接 在应用程序启动时,我会检查文件是否存在,如果不存在,则创建它。注意:这一部分非常粗略,因为它是为了快速测试应用程序本身,将在未来改变它。这就是它看起来的样子: if (!F

首先。以前从未在这里发布过,如果我违反任何规则,请道歉

我正在尝试为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();
要加载文件,请执行以下操作:

    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)
W/System.err:java.io.StreamCorruptedException:无效流头:02FD0D3D
位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808)
位于java.io.ObjectInputStream。(ObjectInputStream.java:302)
在theredspy15.vault115.enterActivity.loadVault(enterActivity.java:70)
在theredspy15.vault115.EntertActivity.enter(entertActivity.java:41)
位于java.lang.reflect.Method.invoke(本机方法)
在android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
在android.view.view.performClick上(view.java:6256)
在android.view.view$PerformClick.run(view.java:24701)
位于android.os.Handler.handleCallback(Handler.java:789)
位于android.os.Handler.dispatchMessage(Handler.java:98)
位于android.os.Looper.loop(Looper.java:164)
W/System.err:at-android.app.ActivityThread.main(ActivityThread.java:6541)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:240)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

读取文件时,您需要将
密码设置为
解密模式。

谢谢,这就解决了问题!我仍然无法检测该文件。与上面显示的我的支票(顶部的if语句)相比,有更好的方法吗?作为openFileOutput方法,参数中只需要一个名称。只要尝试打开它并在出现
FileNotFoundException
时处理它即可。不要试图预测未来。