我有一个加密功能,在各种环境下一直运行良好,但最近,它一直在咳出奇怪的结果。
以下是代码:
public static byte[] Encrypt(String pstrInput) throws Exception {
ByteArrayOutputStream ms;
CipherOutputStream encStream;
OutputStreamWriter sw;
byte[] buffer;
ms = new ByteArrayOutputStream();
encStream = new CipherOutputStream(ms, getEncCipher());
sw = new OutputStreamWriter(encStream);
try {
sw.write(pstrInput);
sw.write("\r\n");
sw.close();
encStream.close();
ms.close();
buffer = ms.toByteArray();
} catch(IOException e) {
throw new Exception("Unexpected IO errors in Security Encrypt", e);
}
return buffer;
}
问题在于,在某些环境中,buffer
将被截断为8个字节,我不明白为什么。
我可以通过评论encStream.close()
行来重现我机器上的问题,但我也不知道为什么。
据我所知,有问题的机器(dev和QA)运行相同的JVM(OpenJDK 1.7 64位)。唯一的区别是dev机器在Eclipse的Jetty中运行代码而QA正在运行Tomcat,但这不应该有任何区别......
任何指针?
答案 0 :(得分:2)
问题不是截断输出。问题是垃圾被添加到代码“工作”的机器上的输出。截断的版本实际上是正确的版本。
关闭流编写器将关闭基础流。此外,关闭一个封闭的流不应该有任何影响。
但是,某些版本的CipherStream似乎存在错误,因此再次关闭它实际上会导致它刷新并加密新块。
这就是为什么注释掉encStream.close()“重新创建”问题(通过实际修复它)。