10

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

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

意识到像 Red Gate 的 .NET Reflector 这样的工具可以直接拔出我的钥匙,我觉得这不是一种非常安全的方法……有没有最佳实践来做这件事?

4

3 回答 3

11

你必须决定什么是可接受的风险水平。没有“安全”的方法可以做到这一点。

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

然后有人将不得不在使用您的代码时执行诸如调试之类的操作并以这种方式获取密钥。您可以使缓存的内容过期并换出密钥。您可以让每个人都有自己的密钥来保护一个用户的数据免受另一个用户的侵害。

您可以做很多事情,但如果您的目标是阻止某人解密您放在他们机器上的程序集能够解密的信息,那么您应该知道这几乎是不可能的。您真正能做的就是提高盗版密钥/数据的成本;你无法阻止它。

于 2010-03-27T06:52:21.493 回答
0

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

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

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

因此,您可以使用公钥加密方法来加密数据。这样黑客可以读取,但不能重新加密。

于 2010-03-27T07:03:26.377 回答
0

正如 Max 所暗示的,您需要考虑一个威胁模型。

你担心什么样的攻击者?(关心一些人是合理的,关心其他人就不那么合理了)。典型的类别可能是“购买程序的非计算机用户”、“愿意在解决方案上花费数小时的专职人员”、“知道如何在网上找到破解的普通用户”等。

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

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

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

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

于 2010-03-27T07:11:11.883 回答