在 node.js 中生成受密码保护的 ZIP 文件

Posted

技术标签:

【中文标题】在 node.js 中生成受密码保护的 ZIP 文件【英文标题】:Generate a password protected ZIP file in node.js 【发布时间】:2013-02-12 09:57:18 【问题描述】:

我需要在 node.js 中创建一个受密码保护的 ZIP 文件。

我正在使用“node-zip”模块,不幸的是它不支持密码保护:

var zip = new require('node-zip')();
zip.file('test.file', 'hello there');
var data = zip.generate(base64:false,compression:'DEFLATE');

寻找其他节点模块来创建 ZIP 文件,我没有找到任何支持密码保护的。

【问题讨论】:

谷歌“创建 zip 节点 js”?尝试***.com/questions/5754153/zip-archives-in-node-js 阅读第一个链接后,似乎生成一个命令行工具是要走的路。 我找到了 a plugin 用于 node-archiver 创建加密的 zip。它也可以在流上运行。但我没有测试它。 【参考方案1】:

如果您在 linux 上工作,那么您可以借助 zip(大多数 linux 发行版中的命令行实用程序)来完成。只需在您的应用中包含以下内容。

spawn = require('child_process').spawn;
zip = spawn('zip',['-P', 'password' , 'archive.zip', 'complete path to archive file']);
zip .on('exit', function(code) 
...// Do something with zipfile archive.zip
...// which will be in same location as file/folder given
);

如果你想压缩一个文件夹,只需在文件夹路径而不是文件路径之前加上另一个参数'-r'。

请记住,这会从主进程生成单独的线程,因此它是非阻塞的。有关child_process 的更多信息,请查看此处http://nodejs.org/api/child_process.html

【讨论】:

您的解决方案似乎没问题,但我需要“即时”创建文件,我的意思是文件系统中不存在文件(它们包含敏感数据)。据我所知,您不能将 zip 命令传递给带有内容的文件结构,对吧? 您的意思是压缩变量中的任何数据,而不是文件中的数据。 Zip 还接受单个破折号(“-”)作为要压缩的文件的名称,在这种情况下,它将从标准输入中读取文件。您可以将文件内容写入生成的子进程的标准输入 zip.stdin.write(data);在同一页面上查找标准输入示例。 nodejs.org/api/child_process.html#child_process_child_stdin 我需要在 zip 中写入两个文件,具有具体名称(我尝试使用“-”作为文件名,但名称在 zip 文件中仍然是“-”)。恐怕我必须使用一个临时目录来解压缩我使用 node-zip 创建的文件,然后使用密码使用 zip 命令再次压缩:(【参考方案2】:

对于像我一样最终来到这里的任何人,我在 node 中尝试了几个包,但最终使用了这个:https://www.npmjs.com/package/minizip-asm.js

它支持密码(使用 AES)并且非常易于使用。我很惊讶它没有那么多下载量,因为它是我发现的唯一一个支持密码的。

【讨论】:

【参考方案3】:

我遇到了同样的问题,但找不到包,所以我自己写了一个,作为archiver 包的插件。纯 JS,无需外部 zip 软件。

这里是 - https://www.npmjs.com/package/archiver-zip-encrypted。 支持旧版 Zip 2.0 加密和来自 WinZip 的 AES-256 加密。

【讨论】:

【参考方案4】:

我正在使用的解决方案(我没有更好的方法)是:

var contenido1 = 'contenido super secreto';
var contenido2 = 'otro contenido';
var password = 'pass';
var nombreFichero = 'fichero'

var nodezip = new require('node-zip')();
var fs = require("fs");
nodezip.file('test1.txt', contenido1);
nodezip.file('test2.txt', contenido2);
var data = nodezip.generate(base64:false,compression:'DEFLATE');
fs.writeFile(nombreFichero + '.zip', data, 'binary');

var exec = require('child_process').exec,
    child;

child = exec('unzip ' + nombreFichero + '.zip -d ' + nombreFichero +
             ' && zip -junk-paths --password ' + password + ' ' + nombreFichero + '-p.zip ' + nombreFichero + '/*' +
             ' && rm -rf ' + nombreFichero + ' && rm -f ' + nombreFichero + '.zip',
  function (error, stdout, stderr) 
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) 
      console.log('exec error: ' + error);
    
);

它会生成一个临时 zip 文件(无密码),然后使用几个命令,upzip、带密码的 zip 和删除临时文件。

【讨论】:

以上是关于在 node.js 中生成受密码保护的 ZIP 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 node.js 中生成密码重置令牌

在 .Net Core 控制台应用程序中生成受信任的自签名证书

检查 zip 或 gzip 是不是经过密码加密(Node.JS)

如何在 node.js 中生成视频缩略图?

如何在 node.js 中生成 PDF

在 Windows 中生成 python ENOENT node.js