【问题标题】:Create and Read password protected ZIP using streams.(Not physical File)使用流创建和读取受密码保护的 ZIP。(不是物理文件)
【发布时间】:2014-09-11 02:51:21
【问题描述】:

我需要实现一个解决方案,创建受密码保护的 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

【问题讨论】:

  • 我认为您需要的大部分内容都在 java.util.zip 中。
  • 不。 java.util.zip 无法对 zip 进行密码保护
  • 但是你可以单独做加密/解密。

标签: zip4j


【解决方案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

【讨论】: