c# - 使用 DPAPI 时安全地存储可选的熵

标签 c# entropy dpapi encryption-symmetric

所以我正在尝试使用 DPAPI 存储对称 key 。一切都很好,但是如何处理熵呢?这回答了问题 here确实没有提供足够的洞察力。这似乎是一个湿滑的斜坡——我可以使用机器商店来存储熵,但是是什么阻止了有人这样做呢?注意:我正在使用用户范围存储当前 key 。

所以我的问题是 - 使用 DPAPI 存储熵的最佳方法是什么?

最佳答案

您在本地存储的任何内容都可能受到损害。但是您可以采取一些措施使其变得更加困难。 Handling Passwords 上有一份文件您可以考虑查看。您将熵 key 视为您的应用程序特定的密码。

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

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

这将是派生 key 的优势。您可以将其派生为其他一些常量数据的散列(需要是不会随着应用程序的修订而改变的东西)。派生散列的一个技巧是将散列与其他一些常量值(如 GUID 或大随机数)结合起来,这样其他人就不能仅结合已知的散列算法并获得您的 key 。这是创建自己的哈希算法的更好替代方法(除非您拥有数学博士学位,否则永远不要这样做)。

在某些时候,您将需要在您的应用程序中硬编码某种 key 。此 key 与散列中的其他一些数据组合以创建您的熵 key ,或用于解密熵 key 。实际上,只要您保留用于解密现有 key 的旧 key ,您就可以在应用程序的新修订版中更改 key 。然后您可以使用新的 key 或方法重新加密它。

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

请记住,无论您做什么,都会受到损害 - 当有人可以完全访问本地计算机和存储在其中的数据时,这种情况总是会发生。解决方案是不断发布更新,这些更新足以改变旧的破解方法。这将使破解的分发变得不那么有值(value),因为很难找到合适的版本。

关于c# - 使用 DPAPI 时安全地存储可选的熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585746/

相关文章:

c# - 使用 Newtonsoft 在 C# 中使用 JSON Schema 验证 JSON

c# - 如何要求 HTTPS 但不重定向

Linux (Ubuntu) 等效于 Windows DPAPI

c# - ProtectData 类使用哪种加密算法?

c# - 如何将不同面板中的单选按钮分组为一个组?

c# - Ninject Constructor 参数检查参数是否存在

r - 我无法计算出 TraMineR 的熵公式

python - python中离散点(LDDP)的限制密度

algorithm - 是否可以检查一小段文本是否是随机的?

c# - 如何使用 Azure 辅助角色和 OWIN 扩展 SignalR