加密截断
Encryption truncated
我有一个加密功能,在各种环境下一直运行良好,但最近,它一直在吐出奇怪的结果。
代码如下:
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()
行在我的机器上重现该问题,但我也不知道为什么。
据我所知,有问题的机器(开发和 QA)是 运行 相同的 JVM(OpenJDK 1.7 64 位)。唯一的区别是开发机器是 运行 Eclipse 的 Jetty 中的代码,QA 是 运行 和 Tomcat,但这应该没有任何区别...
有什么指点吗?
问题不是截断输出。问题是在代码 "works" 所在的机器上的输出中添加了垃圾。截断的版本实际上是正确的。
关闭流编写器将关闭基础流。此外,关闭已关闭的流应该不会有任何影响。
但是,某些版本的 CipherStream 似乎存在错误,再次关闭它实际上会导致它刷新并加密一个新块。
这就是为什么注释掉 encStream.close() "recreates" 问题(通过实际修复)。
我有一个加密功能,在各种环境下一直运行良好,但最近,它一直在吐出奇怪的结果。
代码如下:
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()
行在我的机器上重现该问题,但我也不知道为什么。
据我所知,有问题的机器(开发和 QA)是 运行 相同的 JVM(OpenJDK 1.7 64 位)。唯一的区别是开发机器是 运行 Eclipse 的 Jetty 中的代码,QA 是 运行 和 Tomcat,但这应该没有任何区别...
有什么指点吗?
问题不是截断输出。问题是在代码 "works" 所在的机器上的输出中添加了垃圾。截断的版本实际上是正确的。
关闭流编写器将关闭基础流。此外,关闭已关闭的流应该不会有任何影响。
但是,某些版本的 CipherStream 似乎存在错误,再次关闭它实际上会导致它刷新并加密一个新块。
这就是为什么注释掉 encStream.close() "recreates" 问题(通过实际修复)。