【发布时间】:2012-12-17 14:46:36
【问题描述】:
我知道如果我正在创建和写入一个 zip 文件,我将 ZipOutputStream 包裹在一个 OutputStream(或子类)周围,如下所示:
fos = new FileOutputStream(fileName)
zOut = new ZipOutputStream(fos);
我还知道如何创建 zip 文件以及需要指定何时添加新条目和关闭条目。我想做的是加密存档中的文件,但不加密存档,以便仍然很容易找到条目。 (部分原因是因为不同的条目将在不同的时间被读取 - 如果我加密整个 zip 文件,那么我每次都必须从头开始读取它,即使我需要的 zip 条目是第 99 个。如果整个文件被加密,我将无法随机访问条目。)
我通常知道要加密(或解密),我将一个流包裹在另一个流周围,如下所示:
fos = new FileOutputStream("ciphertext");
CipherOutputStream cos = new CipherOutputStream(fos, key);
并且我假设如果我正在写入 ZipOutputStream 并想要加密条目,以创建 ZipOutputStream,我可以执行上面第一个示例中所做的操作,然后是时候为 zip 写入数据条目,我将 ZipOutputStream 包装在 CipherOutputStream 中,如下所示:
fos = new FileOutputStream(fileName)
zOut = new ZipOutputStream(fos);
...
CipherOutputStream cos = new CipherOutputStream(zOut, key);
但这引发了几个问题:
- 对于这样的事情,一般来说,流的顺序重要吗?如果我将 CipherOutputStream 包装在 ZipOutputStream 中,或者我可以反过来做吗?换句话说,如果整个文件都被加密了,那么哪个流包裹在哪个流周围有关系吗?
- 如果我按照上述方式进行操作,并为每个条目中的数据使用 CipherOutputScream,当我需要关闭该条目并继续下一个条目时该怎么办?我可以销毁 CipherOutputStream 而不影响它所包裹的流吗?
- 有没有更好的方法只加密 zip 条目而不加密 zip 文件中的目录和其他数据?
【问题讨论】:
-
请注意,加密数据的压缩效果不好。
-
@owlstead:谢谢 - 好点,我忽略了一个。我可能只是在加密之前压缩数据。我可以编辑这个类,这样就可以正常完成,所以存档本身不会被压缩,但其中的每个条目在添加之前都会被压缩。
标签: java encryption zip