Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在使用DPAPI时安全地存储可选熵_C#_Entropy_Dpapi_Encryption Symmetric - Fatal编程技术网

C# 在使用DPAPI时安全地存储可选熵

C# 在使用DPAPI时安全地存储可选熵,c#,entropy,dpapi,encryption-symmetric,C#,Entropy,Dpapi,Encryption Symmetric,因此,我尝试使用DPAPI存储对称密钥。一切都很好,很好,但如何处理熵呢?这个问题的答案并不能提供足够的洞察力。这似乎是一个很滑的斜坡——我可以使用机器存储来存储熵,但是什么样的东西也会阻止人们获取熵呢?注意:我使用用户作用域存储当前密钥 所以我的问题是-使用DPAPI存储熵的最佳方法是什么?本地存储的任何东西都可能受到损害。但是,你可以采取一些措施来增加难度。有一份文件,你可以考虑查看一下。您认为您的熵密钥是特定于应用程序的密码。 我将把熵称为键,因为它在功能上是一个附加键 您不想做的是以未加

因此,我尝试使用DPAPI存储对称密钥。一切都很好,很好,但如何处理熵呢?这个问题的答案并不能提供足够的洞察力。这似乎是一个很滑的斜坡——我可以使用机器存储来存储熵,但是什么样的东西也会阻止人们获取熵呢?注意:我使用用户作用域存储当前密钥


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

本地存储的任何东西都可能受到损害。但是,你可以采取一些措施来增加难度。有一份文件,你可以考虑查看一下。您认为您的熵密钥是特定于应用程序的密码。 我将把熵称为键,因为它在功能上是一个附加键

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

这将是导出密钥的优势。您可以将其派生为其他一些常量数据的散列(必须是不会随应用程序的修订而更改的数据)。不过,导出散列的一个技巧是将散列与其他常量值(如GUID或大随机数)组合,这样其他人就不能只组合已知的散列算法并获取密钥。这是一个比创建自己的哈希算法更好的选择(除非你有数学博士学位,否则你永远不应该这么做)

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

如果你想要最好的安全性,那么你可以将熵密钥存储在计算机之外。这需要一个internet连接和一个SSL证书,但它们的密钥永远不会在本地的任何地方被发现。要做到这一点,您可以设置一个更健壮的质询-响应系统,以便每次的请求身份验证都不同,并且密钥通过SSL加密传递,因此无法拦截。一旦密钥被使用,它就会被丢弃。当然,在许多场景中,使用DPAPI进行本地安全存储时,这种情况都无法达到目的


无论您做什么,请记住它都会受到影响-当有人完全访问本地计算机及其存储的数据时,这种情况总是会发生。解决方法是不断发布更新,以充分改变方法,使旧裂纹不再工作。这将降低裂纹分布的价值,因为很难找到一个合适的版本。

首先,让我谈谈原始的帖子问题。它归结为这样一个事实:如果要将熵用于持久化存储,则必须在用户和/或应用程序的权限下存储熵。我想您可以使用存储在应用程序中的密钥对持久存储中的信息进行加密,但恶意应用程序也可以访问此加密密钥。所以,我觉得没有办法防止你在评论中提到的情况。然而,考虑到你所说的是熵的预期用途,我觉得它对解决你的问题没有帮助

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

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

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

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

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


有关详细信息,请参阅。

如果您能更详细地描述您的应用程序,将非常有用。这是什么类型的应用程序:Windows服务、交互式应用程序(Windows窗体/WPF)等?另外,如何存储和检索对称密钥?我的意思是,如果您将DPAPI用于用户存储并自己存储密钥,那么只有您(或可以使用您的凭据登录的人)可以检索该值,在这种情况下,我不确定您正试图通过保护二级熵(您应该担心保护您的凭据)来缓解哪种威胁。当您使用LocalUser保护它时,在本地用户下运行的任何应用程序都可以访问密钥存储。这是一个windows窗体应用程序。与LocalMachine相反,LocalMachine上运行的任何应用程序都可以访问存储来获取密钥,这类似于基本上没有加密。您的语句不是100%准确的。只有在加载了配置文件的同一用户帐户下运行的应用(可以是域用户,不一定是本地用户)才能访问同一密钥存储。因此,如果用户X启动您的Win表单,它将使用用户X加密一个秘密