使用 PHP 创建加密的 zip 存档

2022-08-30 16:36:50

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

有没有人知道一种简单,最重要的是,安全的方法来实现这一目标?我可以创建zip存档,但我不知道如何加密它们,或者,这有多安全。


答案 1

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

现在,简单的答案如下所示:

<?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 password\n";
} else {
    echo "KO\n";
}
?>

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

此示例执行这些更复杂的选项。

<?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 passwords\n";
} else {
    echo "KO\n";
}
?>

启用了对 zip 加密的基础支持,因为 libzip 1.2.0 引入了对加密的支持。所以你需要有php 7.2和libzip 7.2才能运行这段代码...希望这张纸条会在这个答案上“真正很快”被抛弃


答案 2

注意:此答案推荐一种已知不安全的加密方法,即使密码良好。请参阅AES上的评论Winzip QA中的链接。php 7.2(和libzip 1.2.0)中对in-php AES zip加密的支持,这意味着这个答案也很快就会过时。在此之前,请参阅此答案,了解如何调用7z而不是zip命令,该命令支持winzip的AES加密

您可以使用以下命令:

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

其中 pass 是密码,而 file.txt 将被压缩到 file.zip。这应该适用于Windows和Linux,你只需要获得Windows的免费版本的zip(http://www.info-zip.org/Zip.html#Win32 )

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


推荐