解密apache模块中的AES文件?

我有一个符合安全策略要求的客户端来encryption磁盘上的某些文件 。 设备映射程序和AESencryption模块的显而易见的方法是设置当前已经存在的系统来生成encryption的单个文件。

基本上他们有一个使用SSL和基本/摘要风格authentication的apache服务器,他们需要从磁盘上的AES解密encryption的文件,然后再用SSL重新encryption。 (显然,我可以使用mod_php,mod_perl,但是这个想法是保持静态文件只在这个盒子上)

我有任何选项可以在apache上即时解密文件吗?

我看到, mod_ssl和mod_session_crypto做encryption/解密或类似的东西,但不完全是我之后,因为他们是在线encryption,我正在寻找磁盘encryption。

我可以想象一个PerlSetOutputFilter可以与一个合适的Perl脚本配合工作,而且我也看到了mod_ext_filter,所以我可以分叉unix命令并解密文件,但是他们都觉得自己像一个黑客。

我有点惊讶,有没有mod_crypto可用…或者我在这里错过了明显的东西?

推测资源明智的perlfilter是要走的路?

这是一个令人不快的问题。 我曾经遇到类似的情况,要求我以错误的方式解决问题。 这就是说,我不知道一个通​​用的encryption模块,可以让你解密静态文件,因为它们是服务。 我search了几个小时,但是我找不到任何东西。 这并不奇怪,因为它看起来像一个相当专业的问题。

尽pipe如此,我看到了几个select。

  1. 编写自己的C模块并将其作为filter处理程序来实现。
  2. 使用mod_ext_filter和外部可执行文件1来解密文件。
  3. 如果所有文件都有特定的扩展名,则添加一个处理程序来调用CGI脚本来解密并提供文件。 例如, Action decrypt /cgi-bin/decrypt.plAddHandler decrypt .html将导致所有对以.html结尾的文件的请求调用/cgi-bin/decrypt.pl,这将需要读取,解密和提供文件。 请参阅http://httpd.apache.org/docs/current/handler.html#examples
  4. 使用mod_php和mod_rewrite透明地解密并提供来自一个或多个特定位置的任何types的静态文件。

我冒昧地实施了第四个选项的概念certificate,我将在这里分享。 我在这个例子中select了PHP,因为它是无处不在的,它通常包含必要的encryption函数,而且它是用C语言编写的Apache模块,所以速度很快。

假设所有encryption的文件都存储在一个名为data的目录中,并使用相同的密钥进行encryption,我在文档根目录下创build了目录,然后使用OpenSSL创build了一个encryption文件。

 cd /var/www mkdir data echo 'This is my plaintext content.' | openssl aes-256-cbc -a -k secret -out data/test.txt 

然后我在文档根目录下创build了decrypt.php文件,内容如下:

 <?php # NOTE: This is proof-of-concept code. You should audit it for security before # using it in a production environment. # The key to use to decrypt the files $key = 'secret'; $filename = $_SERVER["DOCUMENT_ROOT"] . htmlspecialchars($_SERVER['REQUEST_URI']); $data = file_get_contents($filename); $plaintext = decrypt($key, $data); # Determine the MIME type of the decrypted content $finfo = finfo_open(FILEINFO_MIME_TYPE); $content_type = finfo_buffer($finfo, $plaintext); finfo_close($finfo); header("Content-type: $content_type"); print $plaintext; function decrypt($password, $encrypted_data) { $encrypted_data = base64_decode($encrypted_data); $salt = substr($encrypted_data, 8, 8); $cyphertext = substr($encrypted_data, 16); $password = $password . $salt; $md5_hash = array(); $md5_hash[0] = md5($password, true); $result = $md5_hash[0]; $rounds = 3; for ($i = 1; $i < $rounds; $i++) { $md5_hash[$i] = md5($md5_hash[$i - 1] . $password, true); $result .= $md5_hash[$i]; } $key = substr($result, 0, 32); $iv = substr($result, 32,16); return openssl_decrypt($cyphertext, 'aes-256-cbc', $key, true, $iv); } ?> 

如果你的内容不是base64编码,那么你可以删除解密函数中的第一行,该函数读取$encrypted_data = base64_decode($encrypted_data);

最后,在我的Apacheconfiguration中添加了以下条目:

 <directory /var/www/> RewriteEngine on RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^data/ /decrypt.php [L] </directory> 

现在,从http://www.example.com/data请求的任何文件将被解密并提供,包括从子目录中。 由于重写条件限制了对文件的重写,因此目录索引仍然有效。 我有PHP脚本确定解密内容的MIMEtypes,并相应地更新标题,以便我可以提供encryption的图像,文档,网页等。

这可能不会像自定义Apache模块一样快,但它应该接近。 如果你要提供大量的encryption内容并且性能是一个问题,那么你可以通过安装Alternative PHP Cache来加快速度,这样就不必为每个请求编译PHP页面。

请记住,如果您正在解密大文件,则可能需要增加PHP内存使用的设置。


1你说你觉得这个选项是一个黑客。 为什么? 虽然结果可能会很慢,但是mod_ext_filter是一个支持的核心模块,只要你编写了一个过滤程序就可以使用。

2我从http://us3.php.net/manual/en/function.openssl-decrypt.php#107210借用了decrypt()函数&#x3002;

如果它确保您正在使用的文件并提供安全的交易路线,则可能需要查看受保护的webdav w / mod_ssl:

但是,这不会将文件编码到encryption的存档中。 它只会传输encryption的文件,并为文件访问提供一定程度的身份validation和授权。

不要推出自己的密码 。 只是不要。 你永远无法确定它是安全的,而且第一个你会听到它被破坏的是Anonymous在Pastebin上发布你的公司机密。

使用已经存在的工具(例如Linux系统的dm-crypt / LUKS或Windows系统的BitLocker)。 他们很好理解,任何合理的安全审计员都会知道他们是什么,他们的工作。

如果安全审计员坚持这个不太理想的设置,那么解雇他们是无能的 。