Java 加密后是否进行压缩?
在查看加密方案时,我遇到了以下代码:Java 加密后是否进行压缩?,java,security,encryption,zipoutputstream,Java,Security,Encryption,Zipoutputstream,在查看加密方案时,我遇到了以下代码: @Override public OutputStream encrypt(OutputStream outputStream) throws Exception { // generate the IV for encryption final byte[] encryptionIV = KeyFileUtil.randomBytes(16); outputStream.write(enc
@Override
public OutputStream encrypt(OutputStream outputStream) throws Exception {
// generate the IV for encryption
final byte[] encryptionIV = KeyFileUtil.randomBytes(16);
outputStream.write(encryptionIV);
// now create the encryption cipher
final Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, getKey(), new GCMParameterSpec(128, encryptionIV));
// The CipherOutputStream shouldn't close the underlying stream
outputStream = new FilterOutputStream(outputStream) {
@Override
public void close() throws IOException {
// Do nothing
}
};
final CipherOutputStream cos = new CipherOutputStream(outputStream, cipher);
if (useZip) {
final ZipOutputStream zipOutputStream = new ZipOutputStream(cos) {
@Override
public void finish() throws IOException {
super.finish();
def.end();
}
@Override
public void flush() {
// Do nothing.
}
@Override
public void close() throws IOException {
try {
super.flush();
} catch (final IOException exception) {
// Continue and try to close.
}
super.close();
}
};
zipOutputStream.putNextEntry(new ZipEntry("ResourceContents"));
return zipOutputStream;
}
return cos;
}
据我所知,流的顺序是先加密数据,然后(无用地)压缩数据。这是正确的还是我误解了排序在OutputStreams上的工作方式
谢谢是的,您误解(或阅读)了订单的工作原理 在
new ZipOutputStream(cos)
中,CipherOutputStream
由ZOS
包装,因此数据首先压缩,然后传递到包装流,包装流将加密数据,然后传递到下一个包装流,依此类推
最外层的流首先进入数据,如果启用了压缩,
返回zipOutputStream调用code>,zipstream是最外层的流。这是对的惯用用法。是的,你误解了(或阅读了)排序的工作原理
在new ZipOutputStream(cos)
中,CipherOutputStream
由ZOS
包装,因此数据首先压缩,然后传递到包装流,包装流将加密数据,然后传递到下一个包装流,依此类推
最外层的流首先进入数据,如果启用了压缩,返回zipOutputStream调用code>,zipstream是最外层的流。这是的惯用用法。谢谢!您是否有一些java文档的链接来解释这一点?的构造函数提到流是“构建在指定的底层输出流之上的”,但这并没有给出任何指示,说明在应用流时首先应用哪个流chained@phil这就是你所需要的。ZipOutputStream
正在写入CipherOutputStream
,而不是相反。@phil-well,哪个流首先应用于ZipOutputStream out=new zipoutstream(new CipherOutputStream(foo))调用out.write()
时,是否使用code>?事实上,如果您得到一个ZipOutputStream
,您将知道将应用压缩,但您不一定知道以后是否应用了其他操作,除非您知道流是如何构造的。我找到了我要找的。FilterOutputStream的文档提到:“这些流位于已经存在的输出流(底层输出流)之上,它将其用作数据的基本接收器”。它使用现有流作为其接收器的事实定义了链接流的顺序。感谢@KayamanTo详细说明我之前的评论:当我们有ZipOutputStream(CipherOutputStream(outputStream))
时,zipoutstream
的接收器是CipherOutputStream(outputStream)
这意味着我们正在压缩然后按照预期进行加密谢谢!您是否有一些java文档的链接来解释这一点?的构造函数提到流是“构建在指定的底层输出流之上的”,但这并没有给出任何指示,说明在应用流时首先应用哪个流chained@phil这就是你所需要的。ZipOutputStream
正在写入CipherOutputStream
,而不是相反。@phil-well,哪个流首先应用于ZipOutputStream out=new zipoutstream(new CipherOutputStream(foo))调用out.write()
时,是否使用code>?事实上,如果您得到一个ZipOutputStream
,您将知道将应用压缩,但您不一定知道以后是否应用了其他操作,除非您知道流是如何构造的。我找到了我要找的。FilterOutputStream的文档提到:“这些流位于已经存在的输出流(底层输出流)之上,它将其用作数据的基本接收器”。它使用现有流作为其接收器的事实定义了链接流的顺序。感谢@KayamanTo详细解释我之前的评论:当我们有ZipOutputStream(CipherOutputStream(outputStream))
时,zipouttstream
的接收器是CipherOutputStream(outputStream)
,这意味着我们正在压缩,然后按照预期进行加密,与您的问题无关,但是匿名的ZipOutputStream子类在我看来很可疑。如果真的管用的话,我会把它记录下来的。它提供的任何东西都不是直观的:为什么要在finish()
中结束delfaterfinish()
不是OutputStream(返回类型)的方法,因此调用您的实现的任何人都不会知道他们可以完成()流。他们很可能会close()
it,它将调用def.end()
。防止刷新意味着您真正知道自己在做什么(DeflaterOutputStreap有unsyncflush标志,您弄糟了)。只是好奇与你的问题无关,但匿名ZipoutStream子类“在我看来很可疑”。如果真的管用的话,我会把它记录下来的。它提供的任何东西都不是直观的:为什么要在finish()
中结束delfaterfinish()
不是OutputStream(返回类型)的方法,因此调用您的实现的任何人都不会知道他们可以完成()流。他们很可能会close()
it,它将调用def.end()
。防止刷新意味着您真正知道自己在做什么(DeflaterOutputStreap有unsyncflush标志,您弄糟了)。只是好奇而已