使用 PHP 创建加密的 zip 存档
2022-08-30 16:36:50
我正在寻找一种将.txt文件加密为zip的方法,但以安全密码保护的方式。我的目标是通过电子邮件将此文件发送给我,而任何人都无法读取附件的内容。
有没有人知道一种简单,最重要的是,安全的方法来实现这一目标?我可以创建zip存档,但我不知道如何加密它们,或者,这有多安全。
我正在寻找一种将.txt文件加密为zip的方法,但以安全密码保护的方式。我的目标是通过电子邮件将此文件发送给我,而任何人都无法读取附件的内容。
有没有人知道一种简单,最重要的是,安全的方法来实现这一目标?我可以创建zip存档,但我不知道如何加密它们,或者,这有多安全。
从 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才能运行这段代码...希望这张纸条会在这个答案上“真正很快”被抛弃
注意:此答案推荐一种已知不安全的加密方法,即使密码良好。请参阅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 )
这种安全性可以通过暴力攻击,字典攻击等来破坏。但这并不容易,特别是如果您选择了一个长而难以猜测的密码。