如何在.NET程序集中安全地存储加密密钥

时间:2010-03-27 06:47:09

标签: .net encryption compact-framework key-storage

为了防止有人轻易抓取我的数据,我将来自我服务的数据缓存为加密文件(基本上是复制保护)。

但是,为了做到这一点,我必须将加密密钥存储在.NET程序集中,以便能够加密和解密这些文件。

了解Red Gate的.NET Reflector之类的工具可以直接拉出我的键,我觉得这不是一种非常安全的方法......有没有最好的做法呢?

3 个答案:

答案 0 :(得分:11)

您必须确定什么是可接受的风险级别。这样做没有“安全”的方式。

如果有人使用反射器,或者只是使用System.Reflection.Assembly类打开程序集并以这种方式获取资源的风险太大,那么下一步可能是从服务器下载密钥时你开始了。

然后,有人必须在使用代码时执行类似调试的操作,并以此方式获取密钥。您可以使缓存的内容过期并交换密钥。您可以使每个人都有自己的密钥来保护来自其他用户的一个用户的数据。

你可以做很多事情,但是如果你的目标是让某人无法解密你正在他们的机器上装配的装配具有解密能力的信息,那么你应该知道这几乎是不可能的。您所能做的就是提升盗版密钥/数据的成本;你无法阻止它。

答案 1 :(得分:0)

您无法阻止解密,但您可以阻止对伪造数据进行重新加密:

只要您的代码在其他人可以访问的计算机上运行,​​就无法阻止他们检查程序。然而,反编译和分析会花费时间。正如MaxGuernseyIII指出的那样,这完全取决于可接受的威胁级别。

在您的情况下,问题不在于黑客可以反编译您的代码,而是可以更改您想要保护的数据(谁拥有许可证)。

因此,您可以使用public key cryptography方法加密数据。黑客可以通过这种方式阅读,但他无法重新加密。

答案 2 :(得分:0)

正如马克斯暗示的那样,你需要考虑威胁模型。

你担心哪种攻击者? (关心某些人是合理的,而不关心他人是合法的)。典型的类别可能是“购买程序的非精通计算机的用户”,“愿意花费数小时解决方案的专职人员”,“知道如何在线发现裂缝的临时用户”等。

根据您的具体情况,解决方案可能会有所不同。

值得注意的一件有趣/悲伤的事情是,如果您的产品很受欢迎,那么只需要一两个专门的人坐下来打破它然后为所有人发布补丁。我想这就是软件的本质,当你的整个应用程序在他们的机器上运行时,这是一个未解决的问题。

显然,这意味着如果您的应用程序作为一个网站运行,它就不是问题 - 即它位于您控制的机器上。

我知道这不是一个特别有用的答案。