用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