用PHP创建一个加密的zip压缩文件

我正在寻找一种将.txt文件加密成zip格式的方式,但采用安全的密码保护方式。 我的目标是将此文件通过电子邮件发送给我,而无需任何人阅读附件的内容。

有没有人知道一个简单的,最重要的是,安全的方式来实现这一点? 我可以创建zip压缩文件,但我不知道如何对它们进行加密,或者这是多么安全。


注意:这个答案建议一个已知不安全的密码方法,即使密码很好。 请参阅评论链接以及AES上的Winzip QA。 php-7.2(和libzip 1.2.0)支持in-php AES zip加密,这意味着这个答案很快就会过时。 在此之前,请参阅此答案以了解如何向7z发出呼叫,而不是支持winzip的AES加密的zip命令。

你可以使用这个:

<?php echo system('zip -P pass file.zip file.txt'); ?>

密码为pass,file.txt将压缩到file.zip中。 这应该在Windows和Linux上运行,你只需要获得Windows的免费版本(http://www.info-zip.org/Zip.html#Win32)

这种安全性可以通过暴力攻击,字典攻击等破坏,但这并不容易,特别是如果你选择了一个很长且难以猜测的密码。


尽管PHP是一种成熟的语言 ,但没有足够的方法(不包括自定义扩展或类似的东西)来使用纯PHP实现这样一个简单的任务。
你也可以做的是等到PHP 7.2将可用于生产(cuz ZipArchive :: setEncryptionName被实现(感谢Pierre和Remi))。
但是,在此之前,您还可以尝试将php_zip> = 1.14.0移植到PHP <7.2,但目前没有可用的编译二进制文件,因此您必须自己编译并尝试是否可以完成(我相信它是)。
PS我会尝试,但现在我的电脑上没有VS2015 +。


从php 7.2(一个小时前发布)开始,正确的方法是使用ZipArchive原生php代码中包含的其他功能。 (感谢abraham-tugalov指出这一变化即将到来)

现在简单的答案看起来像这样:

<?php
$zip = new ZipArchive();
if ($zip->open('test.zip', ZipArchive::CREATE) === TRUE) {
    $zip->setPassword('secret_used_as_default_for_all_files'); //set default password

    $zip->addFile('thing1.txt'); //add file
    $zip->setEncryptionName('thing1.txt', ZipArchive::EM_AES_256); //encrypt it

    $zip->addFile('thing2.txt'); //add file
    $zip->setEncryptionName('thing2.txt', ZipArchive::EM_AES_256); //encrypt it

    $zip->close();

    echo "Added thing1 and thing2 with the same passwordn";
} else {
    echo "KOn";
}
?>

但是,您也可以通过索引而不是名称来设置加密方法,并且您可以基于每个文件设置每个密码...以及使用新支持的加密选项指定较弱的加密选项。

这个例子练习了这些更复杂的选项。

<?php
$zip = new ZipArchive();
if ($zip->open('test.zip', ZipArchive::CREATE) === TRUE) { 
     //being here means that we were able to create the file..

     //setting this means that we do not need to pass in a password to every file, this will be the default
    $zip->addFile('thing3.txt');

    //$zip->setEncryptionName('thing3.txt', ZipArchive::EM_AES_128);
    //$zip->setEncryptionName('thing3.txt', ZipArchive::EM_AES_192);
    //you should just use ZipArchive::EM_AES_256 unless you have super-good reason why not. 
    $zip->setEncryptionName('thing3.txt', ZipArchive::EM_AES_256, 'password_for_thing3');

     $zip->addFile('thing4.txt');
    //or you can also use the index (starting at 0) of the file...
    //which means the following line should do the same thing...
    //but just referencing the text.txt by index instead of name..
    //$zip->setEncryptionIndex(1, ZipArchive::EM_AES_256, 'password_for_thing_4'); //encrypt thing4, using its index instead of its name...

    $zip->close();
    echo "Added thing3 and thing4 with two different passwordsn";
} else {
    echo "KOn";
}
?>

启用对zip加密的基础支持,因为libzip 1.2.0引入了对加密的支持。 所以你需要安装php 7.2和libzip 7.2才能运行这个代码......希望这篇文章能够“很快地”

链接地址: http://www.djcxy.com/p/57015.html

上一篇: Create an encrypted zip archive with PHP

下一篇: Open password protected ZIP in Android?