客户端/服务器端表单数据加密的最佳实践


Best practice for clientside/server side encryption for form data

我正在计划一个项目,该项目需要将敏感数据从客户端传输到服务器端,然后再传输到AWS简单存储桶。

这是我的计划:

  1. 使用SSL/HTTP(S),数据可以通过web表单安全地发布,然后由我的web服务器上的PHP脚本检索。

  2. 一旦数据被服务器接收,PHP脚本将立即使用AWS SDK for PHP将其发送到AWS,并指示使用AES-256加密服务器端的数据-参见AWS加密。

问题是,在步骤1和2之间,数据不会被加密,因为它必须首先击中我的web服务器进行处理。我正在考虑让脚本在将数据发送到AWS之前将其写入服务器上的文本文件,然后在发送后立即从服务器上删除临时文件。这样做有风险吗?有没有一种方法可以发送一个文件流,而不是一个实际的文件到AWS简单存储桶,从而避免需要写一个临时文件到服务器?

我是否忽略了更好的方法来实现我最初的目标,即100%加密的数据传输?

如果您正在向磁盘提交文件,那么一个足够有动机的攻击者可以在文件到达磁盘盘的那一刻安排窃取该文件-在大多数现代操作系统上获得磁盘/目录的任何更改通知是相当微不足道的,因此他们可以简单地监视您的临时目录(无论您在何处写入这些文件)并将其复制出来。

即使您立即删除该文件,该文件仍然存在于存储系统的各个缓存中,并且作为磁盘上"可以随时写入"的扇区。除非数据被其他东西覆盖,否则更专门的攻击者仍然可以在删除文件后检索该文件。

除此之外,具有足够访问权限的人可以简单地访问PHP进程的内存空间并从中提取文件。

. .你要问自己的问题是"我的威胁模型是什么?"我在这个文件中存储了什么数据?"

如果数据包括信用卡号码,那么你已经违反了PCI标准- CC号码可以NEVER以明文/可读格式存储在任何地方

我不是加密专家,所以没办法,但是…

如果您不相信web服务器的物理安全性足以依赖标准的Unix系统加固,那么您可能需要获得更好的web服务器。

在中间服务器上使用的任何加密都将受到这样一个事实的影响:解密密钥必须存储在服务器上,以便对数据进行解密,然后将其发送到AWS。如果密钥是可窃取的,那么即使加密数据也不安全。如果它不能被窃取,那么数据怎么可能被窃取呢?

强制系统只使用RAM而不可能写入磁盘是棘手的,并且忽略了一个事实,即具有root访问权限的人也可以在加密之前直接从web服务器进程的RAM读取数据(困难)。

一旦有人拥有了根,除非密钥存储在其他地方,否则就没有真正的防御了,所以我建议在浏览器中使用公钥,在AWS中使用私钥。忘记中途解密吧。如果AWS不能做到这一点,那就不要使用它。这篇文章建议他们这样做,在这里有一个教程,但你需要使用Java的外观。