C# 密钥存储

C# 密钥存储,c#,encryption,C#,Encryption,我试图在我的项目中实现文件加密,但我想知道密钥存储的最佳实践 我们的应用程序部署到各种客户端组。每个组由多个地理站点组成,每个站点依次由多个用户组成。用户创建文件,然后通过中央同步服务器与其他站点同步。这些文件必须在保存时加密,并且只有在客户端站点加载时才能解密 因此,任何对称密钥都需要在组级别上是唯一的,并且安全地存储在每个站点上 我们正在使用AES,但密钥目前是硬编码的,并存储在应用程序中,因此可以通过反编译轻松访问,而且对于所有客户端也是如此,这让我非常担心。一旦您访问了我们的应用程序,就

我试图在我的项目中实现文件加密,但我想知道密钥存储的最佳实践

我们的应用程序部署到各种客户端组。每个组由多个地理站点组成,每个站点依次由多个用户组成。用户创建文件,然后通过中央同步服务器与其他站点同步。这些文件必须在保存时加密,并且只有在客户端站点加载时才能解密

因此,任何对称密钥都需要在组级别上是唯一的,并且安全地存储在每个站点上

我们正在使用AES,但密钥目前是硬编码的,并存储在应用程序中,因此可以通过反编译轻松访问,而且对于所有客户端也是如此,这让我非常担心。一旦您访问了我们的应用程序,就可以对这种设置进行黑客攻击

那么,如何确保为每个组生成一个唯一的密钥,然后在每个站点安全地存储该密钥呢?

保存单个对称密钥的唯一真正安全的方法是让他们输入密码短语/密码并从中生成密钥。这样,没有用户输入,应用程序就不知道密钥

或者在某个单独的文件中提供密钥(通过接口、注册表或简单地将其放置在适当的路径)以便加密工作

最后,安全性总是落在用户身上。

保存单个对称密钥的唯一真正安全的方法是让他们输入密码短语/密码,并由此生成密钥。这样,没有用户输入,应用程序就不知道密钥

或者在某个单独的文件中提供密钥(通过接口、注册表或简单地将其放置在适当的路径)以便加密工作


最后,安全性总是取决于用户。

这有点不符合我的能力,所以我只是告诉你我知道的

您是否看过使用证书以及在Windows证书存储中使用证书


我的意思是,那基本上是唯一安全储存它的地方,我想…

这有点不适合我,所以我只是告诉你我知道的

您是否看过使用证书以及在Windows证书存储中使用证书


我的意思是,这基本上是唯一可以安全存储它的地方,我认为…

这不是对称加密的好用例。这就是不对称安全性的实际要求。您可以分发公钥(使用PKI,或者通过在应用程序内的信任存储中分发公钥)。然后使用接收方的公钥(例如,属于中央服务器的密钥对之一或组中的密钥对之一)加密对称密钥,并使用对称密钥加密实际数据


有时对称加密是以这种方式使用的,例如在智能卡中存储密钥,但与非对称加密相比,密钥管理总是可怕的。

这不是对称加密的好使用案例。这就是不对称安全性的实际要求。您可以分发公钥(使用PKI,或者通过在应用程序内的信任存储中分发公钥)。然后使用接收方的公钥(例如,属于中央服务器的密钥对之一或组中的密钥对之一)加密对称密钥,并使用对称密钥加密实际数据


有时,对称加密是以这种方式使用的,例如在智能卡中存储密钥,但与非对称加密相比,密钥管理总是可怕的。

+1我同意,我会更进一步,说密钥应该是随机的,并且密钥应该用PBE加密。这样,您可以在需要时更改密码,而无需重新加密文件。我一直在为谷歌项目的c#工作,该项目将在不久的将来正式发布,除了PBE键外,它还内置了键旋转和版本控制。谢谢大家,这是一个很好的解决方案,但我认为我不能使用。文件加密密钥需要对组中的所有站点可用,并且密钥(或相关机密)必须仅对极少数超级用户可用。因此,我需要将秘密存储在某个地方,以便定期使用该密钥。+1我同意,我会更进一步,说密钥应该是随机的,并且该密钥应该用PBE加密。这样,您可以在需要时更改密码,而无需重新加密文件。我一直在为谷歌项目的c#工作,该项目将在不久的将来正式发布,除了PBE键外,它还内置了键旋转和版本控制。谢谢大家,这是一个很好的解决方案,但我认为我不能使用。文件加密密钥需要对组中的所有站点可用,并且密钥(或相关机密)必须仅对极少数超级用户可用。因此,我需要将秘密存储在某个地方,以便定期使用该密钥。