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

问题描述 投票:0回答:5

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

php file encryption aes php-openssl
5个回答
4
投票

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

mcrypt_encrypt
评论中)。

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

enter image description here


编辑:如果可能,您应该使用 OpenSSL 等效功能。这没有(很好)记录,但您应该能够使用 在 Scott 提到的评论中的链接中找到的代码 执行相同的操作。请注意,您应该首先在没有填充的情况下执行所有操作,然后在最后一段使用填充


2
投票

我已经发布了两个函数,可以使用

openssl_encrypt()
使用 AES-128-CBC 算法来加密和解密大型文件。

请参考这个openssl_encrypt()


1
投票

更新答案

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

使用诸如 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

是示例代码


0
投票

我创建了一个可以通过composer使用的简单的Github项目https://github.com/bigb06/PHPCypherFile

PHPCypherFile 为加密大文件提供了强大的解决方案 安全地无需显着的内存开销。它结合了以下力量 用于公钥/私钥加密的 RSA 和用于对称的 AES-256-CBC 加密,保证性能和安全性。


-6
投票

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

就存储文件的加密版本而言,我不推荐。

© www.soinside.com 2019 - 2024. All rights reserved.