当前位置:  开发笔记 > 编程语言 > 正文

使用PHP创建加密的zip存档

如何解决《使用PHP创建加密的zip存档》经验,为你挑选了2个好方法。

我正在寻找一种方法将.txt文件加密成zip,但是采用安全的密码保护方式.我的目标是通过电子邮件发送此文件给我,没有人能够阅读附件的内容.

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



1> fromvega..:

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

你可以用这个:


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

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


ZIP加密实际上相当薄弱,有些攻击会在相对较短的时间内产生工作密码(如果不一定是最初使用的密码).
这个答案非常危险.这个答案使用的加密非常弱.它不是现代基于AES的加密技术.

2> ftrotter..:

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

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

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";
}
?>

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

此示例练习这些更复杂的选项.

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";
}
?>

由于libzip 1.2.0引入了对加密的支持,因此启用了对zip加密的底层支持.所以你需要有php 7.2和libzip 7.2才能运行这段代码...希望这个说明将在这个答案"真的很快"

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有