当前位置: 首页 > 知识库问答 >
问题:

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

毋宸
2023-03-14

我知道,如果创建并写入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(文件名)
zOut=new ZipOutputStream(fos);
...
CipherOutputStream(zOut,key);

但这提出了几个问题:

  1. 像这样的东西,一般来说,流的顺序重要吗?如果我将CipherOutputStream包装在ZipOutputStream中,或者我可以用相反的方式来完成它,这会有关系吗?换句话说,如果整个文件都被加密了,哪个流围绕着哪个流会有关系吗?
  2. 如果我按照上面的方法执行,并对每个条目中的数据使用CipherOutputSream,那么当我需要关闭该条目并继续到下一个条目时,我该怎么办?我可以在不影响它所环绕的流的情况下销毁CipherOutputStream吗?
  3. 是否有更好的方法只加密zip条目而不加密zip文件中的目录和其他数据?

共有1个答案

赫连华皓
2023-03-14

别和溪流混淆了。有一个流在磁盘上创建/更新归档文件(ZipoutputStream)。此流未编码,因此您必须保留此代码。

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

现在加载数据进行加密,并创建一个CipherOutputStreamByteArrayOutputStream写入的CipherOutputStream。以这种方式对所有数据进行编码,然后将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

 类似资料:
  • 问题内容: 有人可以帮助我在Maven中创建一个zip目标而不是jar。我尝试了几种方法,但没有进展。汇编路径中给定的描述符文件如下: 我的pom文件中的Assembly plugin部分如下: 最终输出: 问题答案: 您需要通过如下所示的执行将插件绑定到特定的构建生命周期阶段: 之后,您可以通过进行操作。

  • 我试图在ZIP文件内创建一个ZIP文件,以重新构建以前在内存中的zip结构,我在Java。 我失败了,因为我得到了一个错误的内部ZIP内创建的初始ZIP文件。文件已损坏。当试图打开它时,我得到一个“文件的意外结局”。 我得到了这个结构: -input.zip--InnerInput.zip 代码使用java Stack和Map在内存中解压。然后它创建input2.zip,内部nput.zip。 总

  • 我使用Minizip API来压缩和解压我的档案文件。我有一个要求,即在解压缩后立即从zip中删除zip条目。 如果zip归档文件有多个zip条目,我可以在解压缩后立即删除特定的zip条目,然后使用剩余的zip条目压缩归档文件。我可以用一个临时拉链来实现这一点。 但是当我在zip存档中有一个文件时,我只能在完全提取后删除zip。。。。对于这种情况,有没有一种优化方法,可以将zip条目分块提取和删除

  • 问题内容: 我已经使用Java创建了zip文件,如下所示 现在,我想在单击zip文件时提示我输入密码,然后解压缩zip文件。请任何帮助,我应该怎么走? 问题答案: 尝试以下基于以下代码Zip4j: 来自。 用法示例:

  • 问题内容: 我想创建受密码保护的ZIP: 但这只是加密zip中的文件,但我可以打开此zip并查看其中的文件 问题答案: 由于专利问题,Zip4j不支持文件列表的加密。 参见:http : //www.lingala.net/zip4j/forum/index.php?topic=104.0 更新: 如链接中所述。zip规范不包括文件列表的加密。要隐藏文件名,您可以创建一个zip文件,其中包含您的文