在公共服务器上,你应该把加密密钥放在哪里?

6
我正在使用NServiceBus和MSMQ在我的Web应用程序和服务之间通信。我需要加密消息有效内容,这样如果消息本地排队在Web服务器上(服务主机关闭),敏感数据就无法查看。
由于Web服务器面向公众,因此我不仅需要加密可能以任何方式序列化到磁盘的数据,还不能将加密密钥存储在Web服务器上。
我考虑使用DPAPI存储密钥,但由于密钥将存储在主机上,我还不知道是否符合要求。另一个选择是在Web应用程序启动时从服务请求密钥,并将其保存在内存中,直到应用程序池寿命结束。
我以前没有处理过这个加密级别的要求,并希望找出其他人正在做什么,并获得有关上述想法的反馈。

4
无论你做什么,请聘请一位安全顾问来验证你的设计/实现的有效性。如果你不是这个领域的专家,很容易犯错误,而这样的错误可能会带来巨大的代价,与支付某人帮助你正确完成相比。参考Heartland付款系统。 - jason
1
这对我来说似乎不是非对称加密可以解决的问题。 - rook
非对称密钥至少可以降低观察者从磁盘读取现有状态的概率。但是,如果观察者掌握了非对称密钥,他们可以使用它来发起暴力攻击。 - stephbu
4个回答

7

您是否能够使用公钥/私钥加密?如果是这样,那么您只需要在服务器上使用公钥,数据将在其他地方使用私钥进行解密。


值得注意的是,公钥-私钥加密可能需要大量的密码学安全熵(用于消息密钥、IV 和填充)- 这在高吞吐量时可能是一个问题。 - bdonlan
是的,我同意 - 非对称密钥将会极大地帮助。在高吞吐量系统中实现足够强大的加密可能需要严重的计算能力。在我们的某些场景中,我们转向了加密硬件 - 昂贵、难以集成,但是值得的。 - stephbu
听起来很不错,但我不确定能否获得成本批准。像你所说的,没有专用硬件,非对称加密会影响吞吐量。我考虑过只使用非对称加密进行密钥交换,但解密密钥的密钥仍然需要存储在Web应用程序可以访问的地方。 - Mark J Miller

1
“由于 Web 服务器是公共面向的,我不仅需要加密可能被序列化到磁盘上的数据,而且不能在 Web 服务器上存储加密密钥。”
“看起来这是唯一需要关注的限制 - 首先验证它是否正确。这将排除 DPAPI + 本地密钥存储方法。”
“通过服务传递密钥是可行的,但该服务仍然必须对调用者进行身份验证。如果您的服务器被攻击者冒充合法调用者,观察调用等都是可能的。此外,如果您只在内存中存储密钥,则该内存仍然可以在调试器或内存转储、提升特权进程等中被发现。”
“硬件加密卡是克服后两种情况的唯一方法。”

我认为你关于通过服务交付密钥是正确的。虽然有人告诉过我我们不能在Web服务器上存储密钥,但我怀疑我不会得到硬件加密卡的批准。我更多地关注DPAPI,如果我使用用户范围而不是机器范围,我可能会得到批准。我的经理整天都在开会,所以我必须等到他批准之前。 - Mark J Miller

0

是的,我已经看过这个了,但根据您提供的链接中的文档:“当发送私人消息时,消息队列确保消息体在离开源队列管理器到达目标队列管理器的整个过程中都保持加密。” 我需要在消息在队列中时也进行加密,而 MSMQ 似乎并不原生支持这一点。 - Mark J Miller

0

谢谢!我不知道那是一个选项。经过与我们的安全主管讨论后,我们将从非公共服务器请求密钥并将其存储在内存中。 - Mark J Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接