Webserver即时解密?

时间:2010-12-11 19:43:34

标签: php security apache encryption webserver

我正在处理一个涉及绝对关键数据的项目的概念。

最重要的部分是它需要加密存储。

安装了加密文件系统,网络服务器从中提供文件是不够的。

解密数据的密钥应该在安全连接的请求URI中传递,并附带散列和时间戳。

基于时间戳,密钥和文件名的哈希验证URI并将其存储在列表中,因此只能访问一次。

现在重要的一点是,网络服务器应该从磁盘中获取文件,并使用从请求URI获取的密钥对其进行解密。

它也应该是高效和快速的。这还需要一种不需要扫描整个文件的加密方法。这样文件就可以逐步解密。我认为AES可以使用加密原子的指定块大小来执行此操作。

因此,一个选项是将源文件读取到一些megs中的php脚本中,我使用aes解密并打印解密的内容。该脚本然后忘记以前的数据并继续下一个块直到eof。

如果aes不支持我可以单独加密文件的已定义大小的块,连接它们并在提供文件时执行相同操作。但是我想坚持一个我不必重新发明的标准,所以我也可以使用标准库来加密文件。

然而,这将是非常低效的。

你知道任何apache / lighttpd / nginx模块或更好的方法吗?

4 个答案:

答案 0 :(得分:3)

您应该使用nmap()打开文件,然后根据需要即时加密数据。

我没有看到比G-Wan(200 KB)更合适的东西,它提供原生C脚本 AES加密(即使C脚本可以链接任何外部库,也不需要外部库现有的图书馆)。

如果你需要达到最佳表现,那么这就是你要走的路。

答案 1 :(得分:1)

您可能需要查看PHP的流过滤器(http://php.net/stream.filters);使用一些粘合代码,您可以使用常规PHP文件访问函数读取加密文件,并且它对现有代码大多是透明的。

答案 2 :(得分:1)

如果找不到允许以块/块方式解密文件的PHP模块,则可以将文件预分割为适当大小的块并单独加密。

当然,请记住,即使您一次只发送一小段明文,仍然有很多其他地方可以保存这些易受攻击的数据 - 特别是在Web服务器的输出缓冲区中。考虑一个大型文件被卡在2400波特调制解调器上的人下载的极端情况。你甚至可以在下载第一个块之前对整个文件进行解密和排队,将整个文件保留在某个缓冲区中。

答案 3 :(得分:1)

没有现成的解决方案来满足您的需求。虽然您已经提供了一些有关数据的信息,但是您没有提供太多关于数据如何首先进入网络服务器的线索。

你正在努力确保数据不会受到损害 - 但如果你在服务器上解密它,那么不仅存在数据被泄露的风险 - 而且还有钥匙将被妥协。也就是说,建筑中的剧场而不是实质。

您似乎在用于加密的算法中具有灵活性 - 这意味着您可以对架构进行一些控制 - 因此可以解决这些问题。

  

基于时间戳,密钥和文件名的哈希验证URI并将其存储在列表中,因此只能访问一次。

如何确保只访问一次?当然,它可以用来减少CSRF的机会窗口 - 但它并没有消除它。

  

然后脚本会忘记以前的数据并继续下一个块直到eof。

这从根本上破坏了加密的目标 - 数据中的模式仍然是显而易见的 - 这为利用对数据的暴力攻击提供了一种机制 - 即使块大小相对较大。请查看the images here进行简单演示。

更安全的方法是使用CBC,并在客户端上进行加密/解密。

有几种加密算法的javascript实现(包括AES)this page有一个很好的工具包。使用HTML5 / localstorage,您可以在HTML / javascript中构建完整的客户端应用程序。

正如您开始发现的那样 - 只是使用一种聪明的加密算法并不能确保您的应用程序安全 - 听起来您需要回过头来考虑如何存储和检索数据,然后再担心您使用的方法加密它。