使用流创建和读取受密码保护的ZIP。(非物理文件)

时间:2014-07-20 13:17:06

标签: zip4j

我需要实现一个创建受密码保护的ZIP流并保存到的解决方案 数据库作为

团块。还需要从数据库中读取密码保护的内容作为流读取。这个

不应创建物理文件。标准JAVA SDK不支持创建和读取密码

受保护的ZIP。我尝试使用不同的解决方案创建物理文件的最可用解决方案。

我找到了用ZIP4J写/读密码保护ZIP的例子

How to password protect a zipped Excel file in Java?

是否可以使用ZIP4j库创建和读取受密码保护的ZIP,而无需创建物理文件。 ?

将补丁应用于其他可用来源似乎很难满足我的要求。

Write a password protected Zip file in Java

1 个答案:

答案 0 :(得分:1)

如果您打算保护数据库中的BLOB数据,为什么不使用javax.crypto.CipherOutputStream/javax.crypto.CipherInputStream

从BLOB读取zip内容并使用ZIP4J将其转换为流非常复杂,您必须首先处理文件头...(检查net.lingala.zip4j.unzip.UnzipEngine类的源代码)

将zip内容写入内存更容易,下面是一个示例代码:

ZipParameters zipParam = new ZipParameters();
zipParam.setSourceExternalStream(true);
//set parameter for encryption... 
zipParam.setEncryptFiles(true);
zipParam.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
zipParam.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
zipParam.setPassword("test123");

ByteArrayOutputStream bo = new ByteArrayOutputStream(256);
ZipOutputStream zout = new ZipOutputStream(bo, new ZipModel());

String[] filenames = new String[]{"1.txt"};
for (int i = 0; i < filenames.length; i++) {
    zipParam.setFileNameInZip(filenames[0]);
    zout.putNextEntry(null, zipParam);
    zout.write(filenames[0].getBytes());//data waiting for compressed...
    zout.closeEntry();
}
zout.finish();
zout.close();

bo.toByteArray();//compressed data of zip file