因此,我尝试使用DPAPI存储对称密钥。一切都很好,但是如何处理熵呢?这个回答的问题here确实没有提供足够的洞察力。这看起来像一个滑坡路--我可以使用机器存储来存储熵,但是是什么阻止了人们也能做到这一点呢?注意:我使用User作用域存储当前键。
所以我的问题是-使用DPAPI存储熵的最佳方法是什么?
发布于 2010-04-10 06:57:50
您在本地存储的任何内容都可能被泄露。但是,您可以采取一些步骤来使其变得更加困难。Handling Passwords上有一篇文档,你可以考虑看一看。您可以将Entropy密钥视为特定于您的应用程序的密码。
我将把你的熵作为你的键,因为它在功能上是一个额外的键。
你不想做的是以未加密的格式在本地存储你的密钥。相反,您希望加密您的密钥,或者从另一个不明显的来源派生密钥。当然,如果您加密密钥,那么您需要存储用于加密它的密钥-但通常情况下,这种单一的间接层足以阻止大多数挑战者。
这将是派生密钥的优点。您可以将其派生为其他一些常量数据的散列(需要是不随应用程序的修订而改变的内容)。不过,派生散列的一个技巧是将散列与其他常量值(如GUID或大型随机数)组合在一起,这样其他人就不能简单地组合已知的散列算法并获得您的密钥。与创建自己的散列算法相比,这是一个更好的选择(除非你拥有数学博士学位,否则永远不应该这样做)。
在某些情况下,您将需要在应用程序中硬编码某种类型的密钥。这个密钥或者与散列中的一些其他数据组合在一起,以创建您的熵密钥,或者用于解密熵密钥。实际上,您可以在应用程序的新版本中更改密钥,只要您保留旧密钥以解密现有密钥。然后您可以使用新的密钥或方法对其进行重新加密。
如果您想要最好的安全性,那么您可以将熵密钥存储在计算机之外。这需要internet连接和SSL证书,但是它们的密钥永远不会保存在本地任何地方以供发现。为此,您可以设置一个更健壮的质询响应系统,以便每次请求身份验证都不同,并且密钥通过SSL加密传递,因此不会被截获。一旦密钥被使用,它就会被丢弃。当然,这种情况违背了许多使用DPAPI进行本地安全存储的场景的目的。
无论您做什么,请记住,它将受到损害-当某人拥有对本地计算机和存储在其中的数据的完全访问权限时,总是会发生这种情况。解决这个问题的方法是不断发布更新,这些更新足够改变方法,使得旧的破解不再有效。这会降低破解的发行价值,因为很难找到正确版本的破解。
发布于 2010-04-15 23:51:37
首先,让我来回答最初的帖子问题。归根结底,如果要将熵用于持久化存储,则必须在用户和/或应用程序的权限下存储熵。我想您可以使用与应用程序一起存储的密钥来加密持久化存储中的信息,但是恶意应用程序仍然能够访问该加密密钥。因此,我不认为有一种方法可以防止您在评论中提到的情况。但是,考虑到您所说的熵的预期用途,我认为它对解决您的问题没有帮助。
听起来,真正的问题似乎是在客户端应用程序和服务器之间建立一个安全的通信通道。在您的设计中,您交换的密钥将用于加密通信。我认为尝试使用自定义代码来解决此问题将导致额外的安全漏洞。
考虑到所有这些,我建议创建一个用于检索敏感信息的WCF (Windows Communication Foundation)服务。显然,它可以用来检索所有信息,但最小的更改是将服务限制为敏感信息。
使用WCF,您可以将客户端和服务器配置为使用安全通道。WCF有很多选项可用于建立到服务器的安全通信通道。
<wsHttpBinding>
<binding>
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</wsHttpBinding>一旦有了安全通道,许多其他问题就会变得更简单,比如访问CC数据。如果数据通过安全通道发送,就会成为授权问题,而不是通道安全问题。
有关详细信息,请参阅How to: Create a Secure Session。
https://stackoverflow.com/questions/2585746
复制相似问题