75

我需要对文件进行压缩和密码保护。有没有一个好的(免费)图书馆?

这需要由第三方打开,因此密码保护需要使用标准工具。

4

9 回答 9

56

您可以尝试Zip4j,这是一个用于处理 zip 文件的纯 java 库。它支持PKWare和AES加密方法的加密/解密。

主要特点:

  • 从 Zip 文件中创建、添加、提取、更新、删除文件
  • 读/写受密码保护的 Zip 文件
  • 支持 AES 128/256 加密
  • 支持标准 Zip 加密
  • 支持 Zip64 格式
  • 支持 Store (No Compression) 和 Deflate 压缩方式
  • 从拆分 Zip 文件中创建或提取文件(例如:z01、z02、...zip)
  • 支持 Unicode 文件名
  • 进度监视器

执照:

于 2011-11-06T14:09:29.493 回答
37

2020 年更新:现在还有其他选择,尤其是Zip4J


经过大量搜索,我找到了三种方法:

一套免费提供的源代码,适用于单个文件 zip。但是,没有许可证。用法是 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 代码的原始主页导出)。它对我有用(zip 中的一个文件),并且很好地填补了 Java 开源库中的一个漏洞。

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

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

于 2009-03-25T15:05:49.853 回答
13

这不是答案,但在评估潜在解决方案时要牢记这一点。

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

有几种类型的 zip 加密。旧的类型(原始 zip 标准的一部分)根本不值得打扰(它可以在不到 10 分钟的时间内通过应用程序轻松在线破解)。

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

唯一比没有加密更糟糕的是认为你有加密并且错了:-)

于 2008-10-04T02:49:30.560 回答
4

7-Zip 可以选择在其命令行模式下添加密码。也许你可以执行它来得到这个结果(它也有很好的压缩比)。

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

请注意,InfoZip 的 Zip 实用程序也非常便携,也支持密码。

于 2008-10-03T11:26:03.070 回答
3

您也可以尝试 TrueZip。有关功能,请参阅以下链接: https ://christian-schlichtherle.bitbucket.io/truezip/

TrueZip 的继任者可以在这里找到: https ://christian-schlichtherle.bitbucket.io/truevfs/

于 2010-11-24T08:28:09.367 回答
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();

您可以在 Mac 上使用 Winzip (v9+) 或 7za(即 7zip)解压缩“/tmp/foo.zip”,使用密码“my-password”。

注意:我不清楚为什么需要在上面的代码中指定两次密码。我不知道如果你在这两个地方使用不同的密码会发生什么。

于 2012-10-24T18:35:46.000 回答
1

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

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

对于 3,您可以只使用 java 将 zip 的流内容加密为普通文件,最好将文件扩展名更改为 .ezip 或类似的文件。

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

于 2008-10-03T11:32:02.217 回答
1

附加信息:我用谷歌搜索了更多,确实,这是一个很常见的问题,而且似乎没有免费的解决方案(还没有?)。

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

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

于 2008-10-03T12:08:57.950 回答
0

有没有一个好的(免费)图书馆?

java.util.zip 将执行压缩,但不会执行密码。不,我不知道有什么免费的。我见过的最便宜的开发者席位是 150 美元。

于 2008-10-03T11:06:06.573 回答