所以我正在尝试使用 DPAPI 存储对称密钥。一切都很好,但是熵怎么办?这里回答的问题确实没有提供足够的洞察力。这似乎是一个滑坡——我可以使用机器商店来存储熵,但是是什么阻止了有人这样做呢?注意:我使用用户范围存储当前密钥。
所以我的问题是 - 使用 DPAPI 存储熵的最佳方法是什么?
所以我正在尝试使用 DPAPI 存储对称密钥。一切都很好,但是熵怎么办?这里回答的问题确实没有提供足够的洞察力。这似乎是一个滑坡——我可以使用机器商店来存储熵,但是是什么阻止了有人这样做呢?注意:我使用用户范围存储当前密钥。
所以我的问题是 - 使用 DPAPI 存储熵的最佳方法是什么?
您在本地存储的任何内容都可能受到损害。但是您可以采取一些步骤来使其变得更加困难。您可以考虑查看有关处理密码的文档。您认为您的熵密钥是特定于您的应用程序的密码。
我将把您的 Entropy 称为您的Key,因为它在功能上是一个附加键。
您不想做的是以未加密格式在本地存储您的密钥。相反,您想要加密您的密钥,或者从另一个不明显的来源派生它。当然,如果您加密了密钥,那么您需要存储用于加密它的密钥 - 但通常这种单层间接性足以阻止大多数挑战者。
这将是派生密钥的优势。您可以将其导出为其他一些常量数据的散列(需要是不会随着应用程序的修订而改变的东西)。派生散列时的一个技巧是将散列与其他一些常量值(如 GUID 或大随机数)结合起来,这样其他人就不能仅仅结合已知的散列算法并获得您的密钥。这是创建自己的哈希算法的更好选择(除非您拥有数学博士学位,否则您永远不应该这样做)。
在某些时候,您将需要在您的应用程序中硬编码某种密钥。此密钥要么与散列中的一些其他数据组合以创建您的熵密钥,要么用于解密熵密钥。您实际上可以通过应用程序的新版本更改密钥,只要您保留旧密钥来解密现有密钥。然后您可以使用新的密钥或方法重新加密它。
如果您想要最好的安全性,那么您可以将熵密钥存储在计算机之外。这将需要互联网连接和 SSL 证书,但它们的密钥永远不会在本地任何地方持久存在以被发现。为此,您可以设置一个更强大的质询响应系统,以便每次请求身份验证都不同,并且密钥通过 SSL 加密传递,因此不会被拦截。一旦使用了密钥,它就会被丢弃。当然,这种方式违背了许多使用 DPAPI 进行本地安全存储的场景的目的。
无论您做什么,请记住它会受到损害 - 当有人完全访问本地计算机和存储在其上的数据时,总是会发生这种情况。解决方案是不断发布更新,以改变方法,使旧破解不再有效。这将使破解的分发变得不那么有价值,因为很难找到正确版本的破解。
首先,让我解决原始帖子问题。它归结为这样一个事实,即熵必须存储在用户的权限和/或应用程序的权限下,如果它将用于持久存储。我想您可以使用与应用程序一起存储的密钥来加密持久存储中的信息,但恶意应用程序再次能够访问此加密密钥。因此,我认为没有办法防止您在评论中提到的情况。但是,鉴于您所说的是熵的预期用途,我认为它对解决您的问题没有帮助。
听起来好像实际问题是在您的客户端应用程序和服务器之间建立一个安全的通信通道。在您的设计中,您正在交换将用于加密通信的密钥。我认为尝试使用自定义代码来解决这个问题会导致额外的安全漏洞。
鉴于所有这些,我建议创建一个用于检索敏感信息的 WCF(Windows Communication Foundation)服务。它显然可以用于检索所有信息,但最少的更改是将服务限制为敏感信息。
使用 WCF,您可以将客户端和服务器都配置为使用安全通道。WCF 有很多选项可用于建立与服务器的安全通信通道。
<wsHttpBinding>
<binding>
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</wsHttpBinding>
一旦有了安全通道,许多其他问题就会变得更简单,例如访问 CC 数据。如果该数据通过安全通道发送,则将成为授权问题而不是通道安全问题。
有关更多信息,请参见如何:创建安全会话。