我正在尝试使用 AES 加密 PHP 中的(大)文件,并研究了使用 Mcrypt 和 OpenSSL,问题是到目前为止我发现的所有解决方案都只加密字符串,而我尝试加密的文件会触发PHP 的最大内存限制(不幸的是不能设置得更高),我将如何实现这一目标?
您可以使用 Mcrypt 进行 CBC 加密,然后一次加密一段数据。确保该段是所用密码块大小的 x 倍(例如 AES 为 16 字节)。加密该段并获取生成的密文的最后一个块并将其用作下一个段的 IV。最后一段应该是 PKCS#7 填充的(有很多例子,包括在
mcrypt_encrypt
评论中)。
通过将这些段链接在一起,您将获得与单个加密无法区分的密文(使用此信息测试您的代码)。解密是相同的,使用密文作为IV。要了解其工作原理,请查看 CBC 加密方法:
编辑:如果可能,您应该使用 OpenSSL 等效功能。这没有(很好)记录,但您应该能够使用 在 Scott 提到的评论中的链接中找到的代码 执行相同的操作。请注意,您应该首先在没有填充的情况下执行所有操作,然后在最后一段使用填充。
更新答案
加密大文件是一个难题,因为很难验证没有“块”被篡改。
使用诸如 https://github.com/defuse/php-encryption
之类的库\Defuse\Crypto\File::encryptFile( 'in.file', '输出文件', $键 );
-- 旧答案--
http://www.shellhacks.com/en/Encrypt-And-Decrypt-Files-With-A-Password-Using-OpenSSL
$ openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc
为了不使用太多内存,您需要一个流密码。在 PHP 中用反引号 `
调用此函数或使用 shell_exec
确保变量不是用户输入(例如用户无法控制file.txt)。 自己生成它们。
编辑
由于 shell exec 不可用
http://jeremycook.ca/2011/03/20/easy-file-cryption/
那里有一个解决方案。尽管如此,我还是无法充分强调这一点。流密码很难,我没有完全审查那里的代码,也不认为我有能力。 直接使用开放式 SSL 是一个更好的选择
http://php.net/manual/en/filters.cryption.php
是示例代码
我创建了一个可以通过composer使用的简单的Github项目https://github.com/bigb06/PHPCypherFile
PHPCypherFile 为加密大文件提供了强大的解决方案 安全地无需显着的内存开销。它结合了以下力量 用于公钥/私钥加密的 RSA 和用于对称的 AES-256-CBC 加密,保证性能和安全性。
在您的网站上使用 SSL 将为您解决这个问题。传输的任何文件均由客户端浏览器和服务器使用 HTTPS 协议进行加密。
就存储文件的加密版本而言,我不推荐。