Java如何使用zip4j为整个zip压缩包设置密码保护?
Zip4j加密整个压缩包(含文件列表)的实现方案
默认情况下Zip4j的加密配置仅加密压缩包内的文件内容,存储文件列表、文件大小等元数据的中央目录未被加密,因此无需密码即可查看内部文件列表。要实现全加密保护,需开启中央目录加密配置,具体实现如下:
前置要求
使用Zip4j 2.10.0及以上版本,低版本对中央目录加密的兼容性存在缺陷。Maven依赖示例:
<dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</artifactId> <version>2.11.5</version> </dependency>
完整实现代码
import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.model.enums.AesKeyStrength; import net.lingala.zip4j.model.enums.EncryptionMethod; import java.io.File; public class EncryptedZipCreator { public static void main(String[] args) { // 配置压缩包路径与密码 String zipOutputPath = "/your/target/path/protected.zip"; char[] zipPassword = "your_custom_password".toCharArray(); // 配置加密参数 ZipParameters parameters = new ZipParameters(); // 开启文件加密 parameters.setEncryptFiles(true); // 必须使用AES加密模式,传统Zip标准加密不支持中央目录加密 parameters.setEncryptionMethod(EncryptionMethod.AES); // 设置AES密钥强度,可选128、192、256位 parameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256); // 核心配置:加密中央目录,开启后必须输入密码才能查看文件列表 parameters.setEncryptCentralDirectory(true); try (ZipFile zipFile = new ZipFile(zipOutputPath, zipPassword)) { // 添加单个文件到压缩包 zipFile.addFile(new File("/path/to/source/file.docx"), parameters); // 批量添加整个文件夹到压缩包 zipFile.addFolder(new File("/path/to/source/folder"), parameters); } catch (Exception e) { e.printStackTrace(); } } }
注意事项
- 该加密方式属于Zip规范的扩展特性,主流压缩工具(WinRAR 5+、7-Zip 16+、MacOS自带归档工具、Unzip 6+)均已支持,仅部分老旧的解压工具可能无法识别该加密格式。
- 密码推荐使用
char[]类型存储,使用完成后可手动清空数组内容,降低内存中明文密码泄露的风险。 - 若需要对已存在的压缩包添加全加密保护,需先解压原有压缩包,再按照上述步骤重新创建加密压缩包,无法直接给已有非加密压缩包添加中央目录加密。
内容的提问来源于stack exchange,提问作者HARISH KUMAR B
相关产品推荐
相关产品推荐

