使用 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()
的帮助下使用 AES-128-CBC 算法加密和解密大文件。
请参考这个openssl_encrypt()。
我正在尝试使用 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()
的帮助下使用 AES-128-CBC 算法加密和解密大文件。
请参考这个openssl_encrypt()。