用于压缩文件的免费库推荐

78

我需要压缩并设置密码保护一个文件。有没有一个好用的(免费)库可以实现这个需求?

第三方需要打开该文件,所以密码保护需要能够在标准工具中使用。


9
这个问题怎么会被关闭了? - Dmitry Zaytsev
2
因为Meta认为有用的问题,哪怕是稍微带点主观性的问题,也不适合放在StackOverflow上。这很令人遗憾,但却是事实。 - user314104
Zip4j支持对文件列表进行加密:https://dev59.com/hG7Xa4cB1Zd3GeqPve1J#41568009 - kinjelom
9个回答

58
你可以尝试使用Zip4j,这是一个纯Java库,用于处理zip文件。它支持PKWare和AES加密方法的加密/解密。
主要特点:
  • 创建、添加、提取、更新、删除zip文件中的文件
  • 读写密码保护的zip文件
  • 支持AES 128/256位加密
  • 支持标准zip加密
  • 支持Zip64格式
  • 支持存储(无压缩)和Deflate压缩方法
  • 从分割的zip文件(例如z01、z02、...zip)创建或提取文件
  • 支持Unicode文件名
  • 进度监视器
许可证:

1
它也与Android完美地配合使用 :) 优秀的库,带有出色的示例 +1! - Jay Sidri
5
看起来Zip4j已经被放弃了 :-/ - Patrick Cornelissen
仍然可以工作。 - Deniss M.
2
@PatrickCornelissen 它被放弃了好几年,但自2019年中以来又得到了支持。 - Srikanth Reddy Lingala

38

2020更新:现在有其他选择,特别是Zip4J


经过长时间搜索,我找到了三种方法:

一组免费的源代码,适用于单个文件压缩。但是,没有许可证。使用方法是AesZipOutputStream.zipAndEcrypt(...)。 http://merkert.de/de/info/zipaes/src.zip (https://forums.oracle.com/forums/thread.jspa?threadID=1526137)

更新:这段代码现在已经获得了Apache许可证,并发布在https://github.com/mobsandgeeks/winzipaes(从原始站点Google code导出)。它对我有效(对于zip中的一个文件),并且很好地填补了Java开放源代码库的空缺。

一款商业产品(本文撰写时价格为500美元)。我无法验证其是否有效,因为其试用许可证方法很复杂。它还是一个.NET应用程序的移植版: http://www.nsoftware.com/ipworks/zip/default.aspx

一款商业产品(本文撰写时价格为290美元)。仅适用于Windows,因为它使用了一个dll: http://www.example-code.com/java/zip.asp


有人有这个链接中发布的winzipaes代码使用说明的链接吗?我需要添加多个文件,并需要帮助理解如何使用它。 - frak
@frak 看一下 AesFileEncrypter 的源代码:你只需要创建该类的一个实例,然后添加任何你想要的内容即可。 - Christopher Schultz
1
winzipaes 可通过 Maven 仓库 http://mvnrepository.com/artifact/de.idyl/winzipaes 获取。 - Marc

13

这不是一个答案,而是一条警告,在评估可能的解决方案时要记住。

关于zip加密,有一件非常重要的事情:

有几种类型的zip加密。旧类型(原始zip标准的一部分)根本不值得费心(可以在网上轻松获得的应用程序中不到10分钟就可以被破解)。

如果您正在对zip文件进行任何形式的加密,请务必使用其中一种强加密标准(我相信WinZip的128位和256位AES标准得到了最佳支持)。这里是技术规格 - 我们在开发自己的Java加密zip系统时使用了它(无法提供源代码-抱歉-仅限内部使用)。

唯一比没有加密更糟糕的事情是认为你有加密,但实际上并没有加密 :-)。


2
你可能想要支持两种。目前,Windows Explorer 尚不支持 AES 加密的 zip 文件,但支持 PKZIP 加密的 zip 文件。你可以查看任何类型的加密 zip 文件,但只能使用 Windows Explorer 从 PKZIP 加密(弱加密)zip 文件中提取。你需要在 Windows 上安装 WinZip 或其他适当的工具才能打开 AES 加密的 zip 文件。(免费的 DotNetZip 附带了这样的工具)。 - Cheeso
Windows XP SP3和Vista都支持AES压缩文件。我的观点是(任何人都可以自由地不同意),支持一些根本不安全的东西是一个坏主意。微软不支持一种安全格式并不是实现一些不安全的东西的有效理由。 - Kevin Day
Winzipaes创建的.zip文件在我这里最新的Windows XP镜像上无法打开,Windows会抱怨不支持的压缩方案。但是,它们可以通过7z正常打开。 - Tom Chiverton

4

7-Zip有一个选项可以在其命令行模式下添加密码。也许您可以执行它以获得此结果(并且它具有良好的压缩比)。

缺点:外部进程,难以使其可移植(即使7-Zip本身是可移植的),不确定分发许可证。

请注意,InfoZip的Zip实用程序也支持密码,并且高度可移植。


7-zip有可以在自己编写的程序中使用的库,因此它不必是外部进程。 - Quagmire
@Quagmire 7-zip没有本地的Java构建(除了LZMA算法),因此使用7z处理ZIP文件将需要外部进程。 - Christopher Schultz
@ChristopherSchultz 的确。我想一个人也可以编写JNI或JNA包装器,以避免麻烦。 - PhiLho
值得一提的是,与ZIP 2.0兼容的“密码”已经非常糟糕的破解,不应该被用于除了防止幼儿查看你的文件之外的任何其他用途。 - Christopher Schultz

3

1
我希望早点看到这个,Zip4j还可以,但这个更好。特别是它处理更广泛的输入范围,例如自解压和嵌套的zip文件以及其他许多东西,并且没有被放弃。 - thyme
1
现在阅读此内容的人请注意:自2021年中期以来,Zip4j的开发已经重新开始。 - Daniel Werner

2

这里有一个使用winzipaes 1.0.1的示例。 请注意,这仅是一个梗概,我尚未以完全相同的形式测试此代码。

import de.idyl.winzipaes.AesZipFileEncrypter;
import de.idyl.winzipaes.impl.AESEncrypterBC;

File aNewZipFile = new File("/tmp/foo.zip");
File existingUnzippedFile = new File("/tmp/src.txt");

// We use the bouncy castle encrypter, as opposed to the JCA encrypter
AESEncrypterBC encrypter = new AESEncrypterBC();
encrypter.init("my-password", 0);  // The 0 is keySize, it is ignored for AESEncrypterBC

AesZipFileEncrypter zipEncrypter = new AesZipFileEncrypter(aNewZipFile, encrypter);
zipEncrypter.add(existingUnzippedFile, "src.txt", "my-password"); 

// remember to close the zipEncrypter
zipEncrypter.close();

你可以使用Winzip(v9+)或7za(即7zip)在Mac上解压“/tmp/foo.zip”,密码为“my-password”。
注意:我不清楚为什么在上面的代码中需要两次指定密码。如果在这两个位置使用不同的密码,我不知道会发生什么。

1

如果您提供更好的使用场景,那么就有其他选择。

  1. 您是否需要将zip文件打开,以便标准Zip工具可以处理zip密码?
  2. 与上一个问题相同,您是否要将此zip传递给必须打开zip的外部实体?
  3. 它只是内部使用,您只想保护zip的内容吗?

对于第3个问题,您可以使用Java加密zip的流内容作为普通文件,最好将文件扩展名更改为.ezip或类似的名称。

对于问题1和2,您可以使用chillkat解决方案,或者等效的解决方案。但请注意,chillkat不是纯Java解决方案,它使用JNI。


Chilkat不是“免费”的,它是试用软件。 - James Schek

1

附加信息:我再谷歌上搜索了一下,这确实是一个相当普遍的问题,并且似乎还没有免费的解决方案(至少目前还没有)。

现在,Zip加密的标准算法已经被很好地定义了:请参阅PKWARE关于.ZIP文件格式的应用说明。它似乎是对加密流进行加密的。如果有人想编写它...

现在,我想知道为什么Sun没有将其包含在其库中?缺乏标准?专利/法律问题?太弱以至于无法使用?


大约5年前,我为我们的一个应用程序做了完全相同的事情。这需要一些努力(不幸的是,我不能发布代码),但知道它可以完成是很好的。我们实际上实现了WinZip推广的AES强加密系统。 - Kevin Day

-1
有没有一个好的(免费)库可以做到这一点?
java.util.zip可以进行压缩,但它不会处理密码。而且,我不知道有任何免费的库可以做到这一点。我见过的最便宜的是150美元一个开发者席位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接