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