我们有一个WPF应用程序,允许我们的用户下载加密的内容,我们希望提供离线解密此内容的功能。这个想法是下载密钥并使用DPAPI存储它们,但是entropy参数遇到了麻烦。

有什么方法可以生成熵,而无需对它们进行硬编码/存储就可以始终用于DPAPI函数?

谢谢
托尼

最佳答案

来自Securely Storing Optional Entropy While Using DPAPI

您在本地存储的任何内容都可能遭到破坏。但是,您可以采取一些步骤来使其变得更加困难。您可以考虑在Handling Passwords上找到一份文档。您将您的熵密钥视为特定于您的应用程序的密码。

我将把您的熵称为您的密钥,因为它在功能上是一个附加密钥。

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

那将是获得密钥的好处。您可以将其派生为其他一些恒定数据的散列(需要是不随应用程序的修订而变化的东西)。但是,推导散列时的一个窍门是将散列与其他常数值(例如GUID或较大的随机数)组合在一起,以使其他人不能仅仅组合已知的散列算法并获取您的密钥。这是创建自己的哈希算法(除非您在数学中拥有PHD的方法,否则永远不要这样做)的更好的选择。

在某些时候,您将需要在应用程序中进行某种形式的硬编码。该密钥或与哈希中的其他一些数据组合以创建您的熵密钥,或用于解密熵密钥。实际上,只要保留旧密钥以解密现有密钥,就可以在应用程序的新版本中进行密钥更改。然后,您可以使用新的密钥或方法对其进行重新加密。

如果您想要最好的安全性,则可以将Entropy密钥存储在计算机之外。这将需要Internet连接和SSL证书,但是它们的密钥永远不会在本地要发现的任何地方持久存在。为此,您可以设置一个更强大的质询响应系统,以便每次请求身份验证都不同,并且该密钥通过SSL加密传递,因此无法被截取。一旦使用了密钥,则将其丢弃。当然,这种违背了许多使用DPAPI进行本地安全存储的方案的目的。

无论您做什么,请记住它会受到损害-当某人对本地计算机及其上存储的数据具有完全访问权限时,总是会发生这种情况。解决方案是继续发布更新内容,以更改方法,以使旧破解不再起作用。由于很难找到正确版本的裂纹,这将使裂纹的分配价值降低。

10-07 14:32