我需要压缩并设置密码保护一个文件。有没有一个好用的(免费)库可以实现这个需求?
第三方需要打开该文件,所以密码保护需要能够在标准工具中使用。
我需要压缩并设置密码保护一个文件。有没有一个好用的(免费)库可以实现这个需求?
第三方需要打开该文件,所以密码保护需要能够在标准工具中使用。
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
这不是一个答案,而是一条警告,在评估可能的解决方案时要记住。
关于zip加密,有一件非常重要的事情:
有几种类型的zip加密。旧类型(原始zip标准的一部分)根本不值得费心(可以在网上轻松获得的应用程序中不到10分钟就可以被破解)。
如果您正在对zip文件进行任何形式的加密,请务必使用其中一种强加密标准(我相信WinZip的128位和256位AES标准得到了最佳支持)。这里是技术规格 - 我们在开发自己的Java加密zip系统时使用了它(无法提供源代码-抱歉-仅限内部使用)。
唯一比没有加密更糟糕的事情是认为你有加密,但实际上并没有加密 :-)。
7-Zip有一个选项可以在其命令行模式下添加密码。也许您可以执行它以获得此结果(并且它具有良好的压缩比)。
缺点:外部进程,难以使其可移植(即使7-Zip本身是可移植的),不确定分发许可证。
请注意,InfoZip的Zip实用程序也支持密码,并且高度可移植。
这里有一个使用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();
如果您提供更好的使用场景,那么就有其他选择。
对于第3个问题,您可以使用Java加密zip的流内容作为普通文件,最好将文件扩展名更改为.ezip或类似的名称。
对于问题1和2,您可以使用chillkat解决方案,或者等效的解决方案。但请注意,chillkat不是纯Java解决方案,它使用JNI。
附加信息:我再谷歌上搜索了一下,这确实是一个相当普遍的问题,并且似乎还没有免费的解决方案(至少目前还没有)。
现在,Zip加密的标准算法已经被很好地定义了:请参阅PKWARE关于.ZIP文件格式的应用说明。它似乎是对加密流进行加密的。如果有人想编写它...
现在,我想知道为什么Sun没有将其包含在其库中?缺乏标准?专利/法律问题?太弱以至于无法使用?