使用DPAPI时安全存储可选熵

时间:2010-04-06 14:46:24

标签: c# entropy dpapi encryption-symmetric

所以我试图使用DPAPI存储对称密钥。一切都很好,但是如何处理熵呢?这个回答的问题here确实无法提供足够的见解。这似乎是一个滑坡 - 我可以使用机器商店来存储熵,但是那么是什么阻止了某人也可以使用它?注意:我使用用户范围存储当前密钥。

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

2 个答案:

答案 0 :(得分:6)

您在本地存储的任何内容都可能会受到影响。但是你可以采取一些措施来使它变得更加困难。您可以考虑查看Handling Passwords上的文档。您认为您的熵密钥是特定于您的应用程序的密码。

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

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

这将是获得密钥的优势。您可以将其导出为其他一些常量数据的哈希值(需要随应用程序的修订版而变化)。派生哈希的一个技巧是将哈希与其他一些常量值(如GUID或大型随机数)组合在一起,以便其他人不能只结合已知的哈希算法并获取密钥。这是创建自己的哈希算法的一个更好的选择(除非你有数学博士学位,否则你不应该这样做。)

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

如果您想获得最佳安全性,则可以将熵密钥存储在计算机上。这将需要互联网连接和SSL证书,但是它们的密钥永远不会在本地任何地方被发现。为此,您可以设置更强大的质询响应系统,以便每次请求身份验证都不同,密钥通过SSL加密传递,因此无法拦截。一旦使用密钥,它就被丢弃。当然,这种方法会破坏您使用DPAPI进行本地安全存储的许多场景的目的。

无论您做什么,请记住它会受到损害 - 当有人完全访问本地计算机及其上存储的数据时,总会发生这种情况。解决方案是继续发布更改方法,以便旧方法不再有效。这将使裂缝的分布变得不那么有价值,因为很难找到正确版本的裂缝。

答案 1 :(得分:0)

首先,让我解决原始帖子问题。归结为熵必须存储在用户和/或应用程序的权限下,如果它将用于持久存储。我想你可以使用存储在应用程序中的密钥来加密持久存储中的信息,但恶意应用程序再次能够访问此加密密钥。所以,我觉得没有办法防止你在评论中提到的情况。但是,鉴于你所说的是熵的预期用途,我认为它不会有助于解决你的问题。

听起来好像实际问题是在客户端应用程序和服务器之间建立安全的通信通道。在您的设计中,您正在交换用于加密通信的密钥。我认为尝试使用自定义代码来解决此问题会导致额外的安全漏洞。

鉴于所有这些,我建议创建一个用于检索敏感信息的WCF(Windows Communication Foundation)服务。它显然可以用来检索所有信息,但最少的变化是将服务限制在敏感信息中。

使用WCF,您可以配置客户端和服务器以使用安全通道。 WCF有很多选项可以建立与服务器的安全通信通道。

<wsHttpBinding>
    <binding>
        <security mode="Transport">
            <transport clientCredentialType="Windows" />
        </security>
    </binding>
</wsHttpBinding>

一旦拥有安全通道,许多其他问题就更加简单,例如访问CC数据。如果该数据是通过安全通道发送的,则会成为授权问题,而不是信道安全问题。

有关详情,请参阅How to: Create a Secure Session