在C#中保护加密密钥

时间:2011-03-11 01:43:13

标签: c# vb.net encryption cryptography

我知道.NET框架中提供的许多加密提供程序以及如何使用它们的基础知识。这很简单。

但我关心的是这个。

假设我想使用这些库来加密XML序列化对象,以防止篡改以及任何人出现并查看这些文件内容的能力。

我一直留下的问题是解密这些数据的密钥需要在我的应用程序中的某个地方存储为常量。基本上使整个练习变得毫无意义。

那么,如何在可拆卸的应用程序中安全地存储加密算法的密钥?

编辑:所以,如果我正确理解下面的两个答案。这意味着基本上任何实现(为了安全)都要求它只读或写,但绝不是两者兼而有之?这是对的吗?

4 个答案:

答案 0 :(得分:4)

你没有。如果应用程序可以访问密钥,则只是默默无闻的安全性。最好以某种方式验证用户(密码是最简单的示例),以确保允许他访问数据。您不能让应用程序为您执行此操作,因为它根本不值得信任。任何人都可以获得存储在应用程序中的信息。

如果密钥信息存储在其他位置,恶意用户或应用程序也可能会访问它。如果没有,那么将您的数据直接存储到那个神奇的安全地方。

现在,如果您仍然希望沿着该路径走下去并在没有身份验证的情况下存储敏感数据,那么最好的选择 - 或者至少是一种中途安全的简单方法 - 可能就是DPAPI(请参阅ProtectedData类{ {3}})。它将使用机器密钥或用户帐户密钥对数据进行加密(您可以选择)。因此,在另一台计算机或另一个用户帐户上运行的程序无法访问它。 Windows将尝试保护这些密钥,但实际上在正确的计算机上运行的任何应用程序或使用正确的用户帐户都可以访问您的数据。

答案 1 :(得分:1)

我们假设您正在使用某种公钥加密方案,否则它将毫无意义。

答案是将私钥存储在应用程序的任何位置。您将它存储在只有您的应用程序可以访问它的地方。例如,本地系统中只有管理员和您的应用程序有权读取它的文件。在受保护的网络共享上。等

想想我们如何像人一样管理密钥。我们将私有文件保存在文件中,或加密的USB驱动器或类似的东西。相同的原则适用于应用程序。

答案 2 :(得分:0)

有各种可能的解决方案。其中一个是使用RSA。或者,您可以使用TLS中使用的相同方法。

一种好方法是生成一对公钥和私钥。使用私有加密并销毁密钥。使用公钥,您可以解密但不会篡改数据。

答案 3 :(得分:0)

收集给出的答案:所有加密安全都依赖于对“root”密码的保护。这在可妥协的系统中是无法保证的。

一个可行的硬件架构由例如给出芯片读卡器。作为外部系统,它们不会受到内部恶意操作的影响。

相应地,您可以设置一个单独的“安全服务器”,具有严格的访问限制,例如键盘和本地网络。该服务器将通过在有限时间窗口内与经过身份验证的客户端进行安全通信来提供密码等敏感数据。

建议在此时间窗口内为客户采取的措施是钳制间谍软件、信使、远程控制服务器以及基本的互联网访问、进程监控……

...或者您在安全平台上进行所有敏感数据处理,不包括像 Windows 这样的健谈平台。