2011-03-11 161 views
10

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

但我担心的是这个。

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

我总是留下的问题是,解密这些数据的密钥需要作为常量存储在我的应用程序的某处。基本上使整个练习毫无意义。

那么,如何在反汇编应用程序内安全地存储加密算法的密钥?

编辑:所以,如果我正确理解下面的两个答案。这意味着基本上任何实现(要安全)都要求它是只读或只写,但从来都不是?它是否正确?

+0

尽可能地模糊XML(添加随机数据+使用ROT13原始加密方案+等)并将其序列化为二进制模式或Base64模式。要点是通过程序反汇编对XML进行解码,尽可能让用户不用花时间去做这件事...... – 2011-03-18 14:01:14

回答

4

你没有。如果应用程序可以访问密钥,那只是安全而已。最好以某种方式验证用户(密码是最简单的例子),以确保他被允许访问数据。你不能让应用程序为你做,因为它不可靠。任何人都可以获得存储在应用程序中的信息。

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

现在,如果您仍然希望走这条路,并存储敏感数据,而无需身份验证,最好的办法 - 或者至少是一个简单的方法是半路安全的 - 可能是DPAPI(见System.Security.CryptographyProtectedData类)。它将使用机器密钥或用户帐户密钥加密数据(您可以选择该密钥)。因此,在另一台计算机上运行的程序或另一个用户帐户无法访问它。 Windows将尝试保护这些密钥,但实际上任何在适当的机器上运行的应用程序或具有适当的用户帐户的应用程序都可能能够访问您的数据。

+1

可能使用用户的密码进行加密和解密是个不错的主意。但当然这会暴露密码。可能是密码的散列可以完成这项工作,或者其他一些密码派生的值。 – 2011-03-11 03:02:01

+0

如果您使用自定义形式的身份验证和加密,则可能是对的。如果您使用的是DPAPI,它会自动处理所有这些东西。据我记得,在用户更改密码后,数据仍然可以被解密。 – ollb 2011-03-11 03:11:38

+0

这也造成了它自己的问题。如果用户想更改密码怎么办? – 2011-03-12 14:16:58

0

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

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

+0

如果你销毁私钥,这是一个只读解决方案。但即使如此,恶意用户也可以用自己的密钥对创建新文件,并替换应用程序用于解密的密钥。这当然取决于他修改公钥存储位置的能力。 – ollb 2011-03-11 02:33:51

1

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

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

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

+0

这不就是解决问题吗?如果您确实拥有只有您的应用程序可以访问的受信任位置,则您可以将数据存储在那里并完成它。 – ollb 2011-03-11 02:42:55

+0

没有“只有管理员和您的应用可以访问”的位置。如果你的应用可以访问它,你的应用的用户也可以。 – 2011-03-11 06:10:44