使用 openSSL 加密 PHP 中的(大)文件

Encrypting (large) files in PHP with openSSL

我正在尝试使用 AES 加密 PHP 中的(大)文件,并研究了使用 Mcrypt 和 OpenSSL,问题是到目前为止我找到的所有解决方案都只加密字符串,而我的文件我尝试加密会触发 PHP 的最大内存限制(遗憾的是不能设置得更高),我将如何实现这一目标?

在您的网站上使用 SSL 会为您解决这个问题。传输的任何文件都由客户端浏览器加密,服务器使用 HTTPS 协议。

至于存储文件的加密版本,我不推荐。

您可以使用 Mcrypt 使用 CBC 加密,然后一次加密一段数据。确保该段是所用密码块大小的 x 倍(例如,AES 为 16 字节)。加密该段并获取生成的密文的最后一个块并将其用作下一个段的 IV。最后一段应该是 PKCS#7 填充的(那里有很多例子,包括在 mcrypt_encrypt 评论中)。

通过将这些段链接在一起,您可以获得与单个加密无法区分的密文(使用此信息测试您的代码)。解密是相同的,使用 密文 作为 IV。要看它是如何工作的,请看CBC加密方式:


编辑:如果可能,您应该使用 OpenSSL 等效功能。这没有(很好)记录,但你应该能够使用 the code found in the link within the comment that Scott mentioned 来做同样的事情。请注意,您应该首先 执行没有填充的所有操作,然后对最后一段进行填充

更新答案

加密大文件是一个难题,因为很难验证没有“块”被篡改。

使用诸如https://github.com/defuse/php-encryption

之类的库

\Defuse\Crypto\File::加密文件( 'in.file', 'out.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-encryption/

那里有解决办法。虽然我不能强调这一点。流密码很难我没有完整地审查那里的代码,我也不认为我有能力。直接使用 open SSL 是一个更好的选择

http://php.net/manual/en/filters.encryption.php

是示例代码

我已经发布了两个函数,在 openssl_encrypt() 的帮助下使用 A​​ES-128-CBC 算法加密和解密大文件。

请参考这个openssl_encrypt()