我在我的Web应用程序和服务之间使用NServiceBus和MSMQ,我需要能够加密消息有效负载,这样如果消息在Web服务器上本地排队(服务主机已关闭)敏感数据不能被人看。
由于Web服务器是面向公众的,因此我不仅要求加密可能被序列化到磁盘的数据,而且我也不能将加密密钥存储在Web服务器上。
我考虑使用DPAPI存储密钥,但由于密钥将存储在主机上,我还不知道是否违反了要求。我考虑的另一个选项是,当Web应用程序启动时,它可以从服务请求密钥并在应用程序池的生命周期内将其保存在内存中。
我之前没有必要处理这种级别的加密要求,并希望了解其他人正在做什么,并对上述想法得到一些反馈。
答案 0 :(得分:7)
您可以使用公钥/私钥加密吗?然后,您只需要服务器上的公钥,并使用其他地方的私钥解密数据。
答案 1 :(得分:1)
“由于Web服务器面向公众,我不仅要求加密可能被序列化到磁盘的数据,而且我也无法将加密密钥存储在Web服务器上。”
似乎这是唯一要关注的约束 - 验证它对于初学者是否属实。它将排除DPAPI +本地密钥存储方法。
通过服务交付密钥是合理的,但该服务仍然需要对呼叫者进行身份验证。如果您的服务器被伪装成合法的呼叫者,则可以观察呼叫等。此外,如果您仅将密钥存储在内存中,则在调试器或内存转储,升级的特权进程等中仍可发现该内存。
硬件加密卡是克服后一种情况的唯一方法。
答案 2 :(得分:0)
encrypt is at the queue level的最佳位置。您可以通过sending private messages执行此操作并创建仅接受私人消息的队列。虽然您可以在创建时创建队列时设置队列隐私级别,但我不确定您是否可以配置NServiceBus来发送私人消息。
答案 3 :(得分:0)
您可以覆盖NServiceBus从中提取加密密钥的来源 - 这在此处的文档中有所描述:http://docs.particular.net/nservicebus/security/encryption
这样,您就可以避免将此敏感信息留在DMZ上。