我需要对文件进行压缩和密码保护。有没有一个好的(免费)图书馆?
这需要由第三方打开,因此密码保护需要使用标准工具。
您可以尝试Zip4j,这是一个用于处理 zip 文件的纯 java 库。它支持PKWare和AES加密方法的加密/解密。
主要特点:
执照:
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
这不是答案,但在评估潜在解决方案时要牢记这一点。
关于 zip 加密的一件非常重要的事情:
有几种类型的 zip 加密。旧的类型(原始 zip 标准的一部分)根本不值得打扰(它可以在不到 10 分钟的时间内通过应用程序轻松在线破解)。
如果您正在对 zip 文件进行任何类型的加密,请务必使用其中一种强加密标准(我相信 WinZip 的 128 位和 256 位 AES 标准得到最好的支持)。以下是技术规格- 我们在开发自己的 Java 加密 zip 系统时使用了它(无法提供源代码 - 抱歉 - 仅供内部使用)
唯一比没有加密更糟糕的是认为你有加密并且错了:-)
7-Zip 可以选择在其命令行模式下添加密码。也许你可以执行它来得到这个结果(它也有很好的压缩比)。
缺点:外部过程,难以移植(即使 7-Zip 本身是可移植的),不确定分发许可证。
请注意,InfoZip 的 Zip 实用程序也非常便携,也支持密码。
您也可以尝试 TrueZip。有关功能,请参阅以下链接: https ://christian-schlichtherle.bitbucket.io/truezip/
TrueZip 的继任者可以在这里找到: https ://christian-schlichtherle.bitbucket.io/truevfs/
这是一个使用 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”。
注意:我不清楚为什么需要在上面的代码中指定两次密码。我不知道如果你在这两个地方使用不同的密码会发生什么。
如果您提供更好的使用场景,那么还有其他选择。
对于 3,您可以只使用 java 将 zip 的流内容加密为普通文件,最好将文件扩展名更改为 .ezip 或类似的文件。
对于 1 和 2,您可以使用上述的chillkat解决方案或等效方案。但是请注意,chillkat 不是纯 Java 解决方案,它使用 JNI。
附加信息:我用谷歌搜索了更多,确实,这是一个很常见的问题,而且似乎没有免费的解决方案(还没有?)。
现在,Zip 加密的标准算法已经很好地定义了:请参阅 PKWARE 的.ZIP 文件格式应用说明。它似乎是对加密流进行的加密。如果有人想编码它......
现在,我想知道为什么 Sun 没有将它包含在它的库中?缺乏标准?专利/法律问题?太弱了无法使用?
有没有一个好的(免费)图书馆?
java.util.zip 将执行压缩,但不会执行密码。不,我不知道有什么免费的。我见过的最便宜的开发者席位是 150 美元。