java - 在 Java 中加密 Zip 条目而不是整个 Zip 文件

标签 java encryption zip

我知道如果我正在创建和写入一个 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);

但这提出了几个问题:

  1. 对于这样的事情,一般来说,流的顺序重要吗?如果我将 CipherOutputStream 包装在 ZipOutputStream 中,或者我可以反过来做,这有关系吗?换句话说,如果整个文件都被加密,那么哪个流环绕哪个流是否重要?
  2. 如果我按上述方式操作,并为每个条目中的数据使用 CipherOutputScream,那么当我需要关闭该条目并转到下一个条目时我该怎么办?我可以销毁 CipherOutputStream 而不影响它环绕的流吗?
  3. 是否有更好的方法来仅加密 zip 条目而不加密 zip 文件中的目录和其他数据?

最佳答案

不要与流混淆。有一个流可以创建/更新磁盘上的存档文件 (ZipOutputStream)。此流未编码,因此您必须单独保留此代码。

您想要的是加密各个条目的数据。因此,当您向存档中添加新条目时,请像往常一样使用 putNextEntry() 添加新条目。

现在加载要加密的数据并创建写入 ByteArrayOutputStreamCipherOutputStream。以这种方式对所有数据进行编码,然后将 ByteArrayOutputStream 中的字节附加到存档中:

ByteArrayOutputStream buffer = new ByteArrayOutputStream();

CipherOutputStream cos = new CipherOutputStream(buffer, key);
... encode data ...

byte[] data = buffer.toByteArray();
zOut.write( data, 0, data.length );

请注意,您可能希望使用 ZipFile 读取存档,因为它为您可以包装的每个条目提供了一个单独的 InputStream

关于java - 在 Java 中加密 Zip 条目而不是整个 Zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14135527/

相关文章:

java - Eclipse Maven : SLF4J: Class path contains multiple SLF4J bindings

c# - SVN 即时 ZIP

haskell - 使用 zip 部分应用 <*>

java - 确定高尔夫球座顺序函数 Java

java - 使用 Unmarshal 访问 XML 文档的特定部分

java - 在 Objective-C 中加密并在 Java 中解密的算法

javascript - 在 ABAP 中加密字符串并在 JavaScript 中解密

PHP GD : How to get imagedata as binary string?

java - 为每个服务器请求实例化一个新的 JVM 是否会造成很大的负载?

c - 使用 cjsoe 进行 JSON Web 加密