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