使用DPAPI时安全存储可选熵
所以我试图使用DPAPI存储对称密钥。 一切都很好,但是如何处理熵呢? 这里回答的问题确实无法提供足够的见解。 这似乎是一个滑坡 – 我可以使用机器商店来存储熵但是那么是什么阻止某人也可以使用它? 注意:我使用用户范围存储当前密钥。
所以我的问题是 – 使用DPAPI存储熵的最佳方法是什么?
您在本地存储的任何内容都可能受到损害。 但是你可以采取一些措施来使它变得更加困难。 您可以考虑查看处理密码的文档。 您认为您的熵密钥是特定于您的应用程序的密码。
我将把你的熵称为你的钥匙 ,因为它在function上是一个额外的钥匙。
您不想做的是以未加密的格式在本地存储您的密钥。 相反,您希望加密密钥,或者从另一个明显来源中获取密钥。 当然,如果你加密密钥,那么你需要存储用于加密它的密钥 – 但是这个单一的间接层通常足以阻止大多数挑战者。
这将是获得密钥的优势。 您可以将其导出为其他一些常量数据的哈希值(需要随应用程序的修订版而变化)。 派生哈希的一个技巧是将哈希与其他一些常量值(如GUID或大型随机数)组合在一起,以便其他人不能只结合已知的哈希算法并获取密钥。 这是创建自己的哈希算法的一个更好的选择(除非你在数学中有PHD,否则你不应该这样做)。
在某些时候,您的应用程序中需要某种密钥硬编码。 此密钥要么与散列中的其他数据组合以创建熵密钥,要么用于解密熵密钥。 实际上,您可以使用新版本的应用程序进行密钥更改,只要保留旧密钥以解密现有密钥即可。 然后,您可以使用新密钥或方法对其进行重新加密。
如果您想获得最佳安全性,则可以将Entropy键存储在计算机上。 这将需要互联网连接和SSL证书,但是它们的密钥永远不会在本地任何地方被发现。 为此,您可以设置更强大的质询响应系统,以便每次请求身份validation都不同,并且密钥通过SSL加密提供,因此无法拦截。 一旦使用密钥,它就被丢弃。 当然,这种方法会破坏您使用DPAPI进行本地安全存储的许多场景的目的。
无论你做什么,请记住它会受到损害 – 当有人完全访问本地机器及其上存储的数据时,总会发生这种情况。 解决方案是继续发布更新,这些更改足以使旧裂缝不再起作用。 这将使得裂缝的分布不那么有价值,因为很难找到正确版本的裂缝。
首先,让我解决原始post问题。 它归结为这样的事实:如果要将熵用于持久存储,则必须将熵存储在用户和/或应用程序的权限之下。 我想你可以使用存储在应用程序中的密钥来加密持久存储中的信息,但恶意应用程序再次能够访问此加密密钥。 所以,我觉得没有办法防止你在评论中提到的情况。 但是,鉴于你所说的是熵的预期用途,我认为它不会有助于解决你的问题。
听起来好像实际问题是在客户端应用程序和服务器之间建立安全的通信通道。 在您的设计中,您正在交换将用于加密通信的密钥。 我认为尝试使用自定义代码来解决此问题将导致额外的安全漏洞。
鉴于所有这些,我建议创建一个用于检索敏感信息的WCF(Windows Communication Foundation)服务。 它显然可以用于检索所有信息,但最少的变化是将服务限制在敏感信息中。
使用WCF,您可以配置客户端和服务器以使用安全通道。 WCF有很多选项可用于建立与服务器的安全通信通道。
一旦拥有安全通道,许多其他问题就变得更加简单,例如访问CC数据。 如果该数据是通过安全通道发送的,则会成为授权而非通道安全的问题。
有关更多信息,请参见如何:创建安全会话 。
- 使用taglib在WPF的“图像”框中显示封面图样
- IIS 7.0与7.5站点Microsoft.Web.Administration.Site BindingCollection
- 我如何在oracle中将参数作为varchar2输出
- 使用带TabItem的命令
- 如何创建JSON.NET Date to String自定义Converter
- 将IP地址添加到HttpRequestMessage
- ViewModel为特定属性订阅Model的PropertyChanged事件
- 如何重新解释将float转换为int? 是否有非静态转换运算符或用户定义的赋值运算符用于’this’的转换?
- 访问修饰符的安全影响(公共,私有,内部,受保护)