2010-03-10 45 views
4

我们有一个WPF应用程序,允许我们的用户下载加密内容,并且我们希望提供脱机解密此内容的能力。这个想法是下载密钥并使用DPAPI存储它们,但是我在熵参数方面遇到了问题。DPAPI + Entropy

有没有什么办法可以生成一个熵来一致地使用DPAPI函数而不用硬编码/存储它们?

感谢 托尼

+0

http://stackoverflow.com/questions/2585746/securely-storing-optional-entropy-while-using-dpapi可能的重复 – 2010-04-09 22:58:33

回答

2

Securely Storing Optional Entropy While Using DPAPI

任何你在本地存储可能会受到影响。但是你可以采取一些步骤来让它变得更加困难。在Handling Passwords上有一份文件,您可能会考虑查看。您认为您的Entropy Key是特定于您的应用程序的密码。

我打算把你的熵作为你的,因为它在功能上是一个额外的键。

你不想要做的就是以未加密的格式在本地存储你的密钥。相反,您想要加密您的密钥,或者从另一个明显的来源派生它。当然,如果您对密钥进行加密,那么您需要存储用于加密的密钥 - 但通常这种间接的单层足以阻止大多数挑战者。

这将是派生你的密钥的优势。你可以把它作为一些其他常量数据的散列(需要是不会随着应用程序的修改而改变的)。虽然派生哈希的一个窍门是将哈希与其他常量值(如GUID或大型随机数)结合起来,这样别人就不能仅仅组合已知的哈希算法并获得您的密钥。这是创建自己的散列算法的更好选择(除非您拥有数学博士学位,否则您绝对不应该这样做)。

在某些情况下,您将需要某种在您的应用程序中硬编码的密钥。该密钥可以与散列中的其他数据结合使用以创建熵密钥或用于解密熵密钥。实际上,只要您保留旧密钥以解密现有密钥,就可以通过新版本的应用程序进行密钥更改。然后你可以用新的密钥或方法重新加密它。

如果您想要最好的安全性,那么您可以将Entropy键存储在计算机中。这需要一个互联网连接和一个SSL证书,但他们的钥匙永远不会在本地任何地方被持续发现。为此,您可以设置更强大的质询响应系统,以便请求身份验证每次都不同,并且密钥通过SSL加密提供,因此不会被截取。一旦钥匙被使用,它就会被丢弃。当然,这种方式在许多使用DPAPI进行本地安全存储的场景中失败了。

无论你做什么,请记住它会被破坏 - 当有人有权访问本地机器和存储在其上的数据时,总会发生这种情况。解决这个问题的方法是不断发布更新,这些更新足以使旧裂纹不再起作用。这将使得一个裂缝的分布不那么有价值,因为很难找到一个适合正确版本的裂缝。

0

有时您的使用提供了一个方便的熵值。例如,如果你想加密一个网站的密码(就像浏览器一样),你的熵值可能就是网站的网址。