You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现仅部分文件受密码保护的Zip压缩包方案咨询

实现Java Zip包中部分文件/目录的密码保护(基于Zip4j)

完全可以实现这个需求!JDK自带的ZipOutputStream并不支持单独给Zip条目加密,而Zip4j正是解决这类场景的绝佳选择——它允许你为压缩包内的指定文件/目录单独设置密码保护,其余内容保持明文状态。下面是针对你需求的具体实现方案:

第一步:引入Zip4j依赖

首先需要在你的项目中添加Zip4j的依赖,以Maven为例:

<dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>2.12.0</version> <!-- 建议使用最新稳定版 -->
</dependency>

Gradle用户可以添加:

implementation 'net.lingala.zip4j:zip4j:2.12.0'

第二步:编写核心实现代码

下面的代码会创建foo.zip,并按照你的要求对secure目录、secure1.txt、secure2.txt加密,foo1.txt保持不加密:

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.enums.AesKeyStrength;
import net.lingala.zip4j.enums.EncryptionMethod;

import java.io.File;
import java.util.Arrays;
import java.util.List;

public class PartialEncryptedZipCreator {
    public static void main(String[] args) {
        // 定义需要加密的目标:目录名以secure开头,以及指定文件
        List<String> encryptedTargets = Arrays.asList("secure", "secure1.txt", "secure2.txt");
        String password = "yourStrongPassword123";
        String zipFilePath = "foo.zip";

        try (ZipFile zipFile = new ZipFile(zipFilePath)) {
            // 准备要添加到Zip的文件/目录
            File sourceDir = new File("./your-source-directory"); // 替换为你的源文件目录
            File[] files = sourceDir.listFiles();

            if (files == null) {
                System.err.println("源目录为空或不存在");
                return;
            }

            for (File file : files) {
                ZipParameters zipParams = new ZipParameters();
                // 判断当前文件/目录是否需要加密
                boolean needsEncryption = shouldEncrypt(file, encryptedTargets);

                if (needsEncryption) {
                    // 设置加密参数
                    zipParams.setEncryptFiles(true);
                    zipParams.setEncryptionMethod(EncryptionMethod.AES);
                    zipParams.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
                    zipParams.setPassword(password.toCharArray());
                }

                // 添加文件/目录到Zip包(目录会递归添加)
                if (file.isDirectory()) {
                    zipFile.addFolder(file, zipParams);
                } else {
                    zipFile.addFile(file, zipParams);
                }
            }

            System.out.println("部分加密的Zip包创建成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 判断当前文件/目录是否需要加密
     */
    private static boolean shouldEncrypt(File file, List<String> encryptedTargets) {
        String fileName = file.getName();
        // 匹配规则:目录名以secure开头,或者文件名是指定的加密文件
        if (file.isDirectory()) {
            return fileName.startsWith("secure");
        } else {
            return encryptedTargets.contains(fileName);
        }
    }
}

关键细节说明

  • 加密参数配置:这里使用了AES-256加密,这是Zip4j支持的最安全的加密方式,你也可以根据需求选择Zip传统加密(但安全性较低)。
  • 目录递归加密:调用addFolder()时,Zip4j会自动递归添加目录下的所有文件,并且会继承该目录的加密参数——也就是说,secure目录下的所有子文件和子目录都会被加密。
  • 明文条目处理:不需要加密的文件直接使用默认的ZipParameters,不设置加密相关参数即可,添加后会以明文形式存在于Zip包中。

注意事项

  • 确保使用的Zip4j版本是2.x以上,旧版本的API可能有所不同。
  • 密码建议使用强密码,避免简单字符串,同时注意密码的安全存储(不要硬编码在代码中)。
  • 测试时可以用Zip4j或者支持AES加密的解压工具(比如WinRAR、7-Zip)验证:加密的条目需要输入密码才能解压,明文条目可以直接查看。

内容的提问来源于stack exchange,提问作者Turkdogan Tasdelen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:23:42