我们有一个 WPF 应用程序,允许我们的用户下载加密内容,我们希望提供离线解密此内容的能力。这个想法是下载密钥并使用 DPAPI 存储它们,但我在使用熵参数时遇到了问题。
有没有办法生成熵以始终用于 DPAPI 函数而无需硬编码/存储它们?
谢谢托尼
您在本地存储的任何内容都可能受到损害。但是您可以采取一些步骤来使其变得更加困难。您可以考虑查看有关处理密码的文档。您认为您的熵密钥是特定于您的应用程序的密码。
我将把您的 Entropy 称为您的Key,因为它在功能上是一个附加键。
您不想做的是以未加密格式在本地存储您的密钥。相反,您想要加密您的密钥,或者从另一个不明显的来源派生它。当然,如果您加密了密钥,那么您需要存储用于加密它的密钥 - 但通常这种单层间接性足以阻止大多数挑战者。
这将是派生密钥的优势。您可以将其导出为其他一些常量数据的散列(需要是不会随着应用程序的修订而改变的东西)。派生散列时的一个技巧是将散列与其他一些常量值(如 GUID 或大随机数)结合起来,这样其他人就不能仅仅结合已知的散列算法并获得您的密钥。这是创建自己的哈希算法的更好选择(除非您拥有数学博士学位,否则您永远不应该这样做)。
在某些时候,您将需要在您的应用程序中硬编码某种密钥。此密钥要么与散列中的一些其他数据组合以创建您的熵密钥,要么用于解密熵密钥。您实际上可以通过应用程序的新版本更改密钥,只要您保留旧密钥来解密现有密钥。然后您可以使用新的密钥或方法重新加密它。
如果您想要最好的安全性,那么您可以将熵密钥存储在计算机之外。这将需要互联网连接和 SSL 证书,但它们的密钥永远不会在本地任何地方持久存在以被发现。为此,您可以设置一个更强大的质询响应系统,以便每次请求身份验证都不同,并且密钥通过 SSL 加密传递,因此不会被拦截。一旦使用了密钥,它就会被丢弃。当然,这种方式违背了许多使用 DPAPI 进行本地安全存储的场景的目的。
无论您做什么,请记住它会受到损害 - 当有人完全访问本地计算机和存储在其上的数据时,总是会发生这种情况。解决方案是不断发布更新,以改变方法,使旧破解不再有效。这将使破解的分发变得不那么有价值,因为很难找到正确版本的破解。
有时你的使用提供了一个方便的熵值。例如,如果您想加密网站的密码(就像浏览器所做的那样),您的熵值可能是该网站的 url。