我正在构建一个应用程序和一个服务器。服务器是一个带有Postgres后端的node.js API。
应用程序中创建的图像将存储在亚马逊S3。有关文件的元数据将存储在Postgres中。
我放大了两种可能的加密密钥解决方案。两者都涉及亚马逊预先签名的URL。这些URL是由Amazon生成的,这是我的服务器调用的结果。
至于文件加密,我可以选择使用(kms),即Amazon生成并跟踪每个文件的单独加密密钥。我的服务器需要使用主键来获得预先签名的URL。
或者,我可以选择在服务器上为每个文件生成单独的加密密钥,并将这些密钥与Postgres中的其余元数据一起存储。Amazon仍然会执行加密/解密,但是我会在请求中传递每个单独的密钥,而不是传递主密钥。
我是个程序员,不是安全专家。如果我需要的话,我会咨询一位专家,但我认为这个论坛的专家也许可以先给出一些更多的见解。
当然,还采取了其他安全措施。应用程序只通过HTTPS与API对话,应用程序通过API进行身份验证(使用Oath2和JWT)。
我真的很喜欢预先签名的URL概念,因为这使得应用程序对S3上传/下载所需的任何密钥都一无所知。
谢谢!
发布于 2017-05-31 14:57:31
以下是对讨论的总结:
你需要知道你想保护钥匙免受什么样的攻击。正如我们所讨论的,您正确地提到了这两种解决方案的优缺点。
我建议将它们混合起来,这样您将使用两个密钥- KEK (密钥加密密钥)和DEK (数据加密密钥)。您将只有一个KEK和与数据库中存储的数据一样多的KEK。
当您将数据存储到DB时,您将生成DEK,用DEK加密数据,用KEK加密DEK,并将加密的DEK与数据一起存储在数据库中。为了读取,您将从DB获得数据和加密的DEK,您可以使用KEK解密DEK,并使用DEK解密数据。
DEK应该仅用于应用程序的内存中。不应在任何其他地方未经加密而存储它。当不需要时,您应该立即从内存中处理它的安全处理(即用零重写字节缓冲区并释放它--注意字符串,因为这些字符串通常是不可变的)。
存储和使用KEK的正确方法应该是在HSM (KMS)中存储和使用KEK,以便某些人,甚至是服务器/应用程序管理员都不会发现它。
它的阴暗面可能是AWS KMS的价格。如果要将其存储在配置中,它可能会被攻击者窃取,然后使用解密数据库转储。但是,你可能不是在保护一个陆军基地;)
还有必要提到的是,如果您需要更改KEK,则必须重新加密DB中存储的所有KEK。
发布于 2017-06-01 07:47:50
重温..。我自己也发了一个答案。
在阅读了更多关于KMS的内容之后,它似乎非常适合我的需求,而且它根本不贵。我们已经使用S3作为文件存储,当我们准备就绪时,我们将在生产环境中使用AWS,因此很容易将KMS添加到设置中。我也将让KMS处理其他秘密,即不再有秘密配置文件。
我担心KMS会使它变得更复杂,但它实际上很容易使用。
我也害怕价格。我以为它的价格会像HSM,但它要便宜得多。
我会在这里留下一些链接,供其他人查找,如果他们与我处于相同的情况。不幸的是,我没有足够的声誉来发布两个以上的链接,所以我将在没有https://前缀的情况下发布其中的一些链接。
概述:
价格:
我可能会在Node.js内部处理这个问题:
在命令行中也很容易使用:
有启发性的阅读,如果你需要初学者的信息,如我所做的:
https://security.stackexchange.com/questions/160868
复制相似问题