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

如何使用Node.js为已有Zip文件加密码保护?已试JSZip、node-zip未果

给已有Zip文件添加密码保护的可行方案

核心原理说明

Zip格式的加密逻辑是在压缩阶段嵌入的,无法直接给已生成的无密码Zip文件“追加”密码——必须先解压原文件,再通过支持加密的工具重新压缩并设置密码。这也是你用JSZip、node-zip直接修改已有Zip失败的根本原因。


方案一:使用archiver + unzipper(推荐,稳定性高)

这两个Node.js模块组合能可靠完成“解压-重新加密压缩”的流程:

  1. 安装依赖
npm install archiver unzipper fs-extra
  1. 示例代码
const fs = require('fs-extra');
const archiver = require('archiver');
const unzipper = require('unzipper');
const path = require('path');

async function encryptExistingZip(sourceZip, targetZip, password) {
  // 创建临时目录存放解压文件
  const tempDir = path.join(__dirname, 'temp_unzip');
  await fs.ensureDir(tempDir);

  try {
    // 解压原Zip到临时目录
    await fs.createReadStream(sourceZip)
      .pipe(unzipper.Extract({ path: tempDir }))
      .promise();

    // 创建加密的新Zip
    const outputStream = fs.createWriteStream(targetZip);
    const archive = archiver('zip', {
      zlib: { level: 9 },
      password: password // 启用ZipCrypto加密(注意:加密强度较低)
    });

    outputStream.on('close', async () => {
      console.log(`加密完成:${targetZip}`);
      await fs.remove(tempDir); // 清理临时文件
    });

    archive.pipe(outputStream);
    archive.directory(tempDir, false); // 添加临时目录下的所有文件
    await archive.finalize();
  } catch (err) {
    console.error('处理出错:', err);
    await fs.remove(tempDir);
    throw err;
  }
}

// 调用示例
encryptExistingZip('./original.zip', './encrypted.zip', 'your-secure-password')
  .catch(err => console.error(err));

方案二:使用JSZip(需配合crypto-js)

JSZip仅支持在生成新Zip时设置加密,因此同样需要先加载原Zip内容,再重新生成带密码的文件:

  1. 安装依赖
npm install jszip crypto-js
  1. 示例代码
const JSZip = require('jszip');
const fs = require('fs').promises;

async function jszipEncryptZip(sourceZip, targetZip, password) {
  const zip = new JSZip();
  // 读取并加载原Zip内容
  const zipContent = await fs.readFile(sourceZip);
  await zip.loadAsync(zipContent);

  // 生成带AES-256加密的新Zip
  const encryptedBuffer = await zip.generateAsync({
    type: 'nodebuffer',
    compression: 'DEFLATE',
    encryption: 'AES-256',
    password: password
  });

  await fs.writeFile(targetZip, encryptedBuffer);
  console.log('加密Zip已生成');
}

// 调用示例
jszipEncryptZip('./original.zip', './encrypted_jszip.zip', 'your-password')
  .catch(err => console.error(err));

注意事项

  • 方案一中的ZipCrypto加密安全性较低,若需高强度加密,建议改用7z格式(可通过node-7z+7zip-bin模块实现)。
  • JSZip的AES加密依赖crypto-js,未安装会导致加密失败。

内容的提问来源于stack exchange,提问作者Harish Shankar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:45:35