Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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 使用SecretKeySpec/StreamCorruptedException存储密钥_Java_Aes_Store - Fatal编程技术网

Java 使用SecretKeySpec/StreamCorruptedException存储密钥

Java 使用SecretKeySpec/StreamCorruptedException存储密钥,java,aes,store,Java,Aes,Store,我读到:还有其他几个条目 我还看了一下: 我在做什么: 我想用AES保护一个文件users.dat,我只是使用一个输出和输入流链 对象->密码->缓冲->文件输出流 文件输入流->缓冲->密码->对象 因此,当我重新启动应用程序时,我想加载存储在该文件users.dat中的数据 我在读取文件users.dat时总是遇到此异常。在从users.dat读取之前,我从key.dat读取了秘密字节 -32115-4061-70-102115-33-123-6494159-6-86115 从简单for循环

我读到:还有其他几个条目

我还看了一下:

我在做什么: 我想用AES保护一个文件users.dat,我只是使用一个输出和输入流链

对象->密码->缓冲->文件输出流

文件输入流->缓冲->密码->对象

因此,当我重新启动应用程序时,我想加载存储在该文件users.dat中的数据

我在读取文件users.dat时总是遇到此异常。在从users.dat读取之前,我从key.dat读取了秘密字节

-32115-4061-70-102115-33-123-6494159-6-86115 从简单for循环输出,这些是写入文件的字节

密钥创建代码:

            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec("wedoit".toCharArray(), SALT, 65536, 128); 
//note I only use 128 here because 256 doesnt work despite having local_policy.jar / US_export_policy.jar in {jdk}/lib/security 

        SecretKey tmp = factory.generateSecret(spec);
        secretBytes = tmp.getEncoded();
        secret = new SecretKeySpec(secretBytes, "AES");
        saveSecret(secret); //saves the bytes to a simple file via object / ciper / buffered / fileoutputstream 
Secdond启动时如果keyfile存在,我从文件中读取字节

-32115-4061-70-102115-33-123-6494159-6-86115与上述输出相同

    try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(keyFile)))
    {
        byte[] secretBytes = new byte[16];
bis.read(secretBytes);
return secretBytes;
}
//catch
对我来说,写入/读取密钥文件似乎是可行的

secretBytes = loadKey(); 
secret = new SecretKeySpec(secretBytes, "AES"); // I thought the key will be reconstructed here?
下面是我用来初始化密码的一些代码

        encryptionCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] ivbyte = encryptionCipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();

    encryptionCipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(ivbyte));

    decryptionCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

    decryptionCipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(ivbyte));
更新 我对资源输入/输出使用try

        try(ObjectInputStream ois = new ObjectInputStream(
            new CipherInputStream(new BufferedInputStream(new FileInputStream(userdbFile)),decryptionCipher)))
    {

        // .... ois.readObject();....
    }
//...catch...
我做错了什么

编辑更新了一点以澄清情况,关于我正在谈论的文件。谢谢你的评论

已经澄清:搬到这里

我注意到一些奇怪的事情,但我不知道这是否是重要的连续调用,具有不同的输出:

编辑:由于jon的评论,似乎没有导入


getEncoded返回一个字节[],并调用不显示数据的toString,因为数组不重写toString。您可能想将内容转换为十六进制或base64。我无法理解这个问题。首先说读取键会引发异常而不发布堆栈跟踪,然后继续说加载键返回的字节与保存的字节相同。发布一个完整的、最小的程序来重现问题。如果你有一个异常,发布它的堆栈跟踪。可能重复感谢你的回答,问题不是sysout打印这些代码。我现在明白他们为什么不同了。但这不是问题所在。
        encryptionCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] ivbyte = encryptionCipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();

    encryptionCipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(ivbyte));

    decryptionCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

    decryptionCipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(ivbyte));
        try(ObjectInputStream ois = new ObjectInputStream(
            new CipherInputStream(new BufferedInputStream(new FileInputStream(userdbFile)),decryptionCipher)))
    {

        // .... ois.readObject();....
    }
//...catch...
System.out.println(secret.getEncoded()); // [B@5c7e77fe
System.out.println(secret.getEncoded()); // [B@78b23edb
System.out.println(secret.getEncoded()); // [B@1e64a539