4

事实上,私有方法是在 C# 中实现的,仍然可以使用Reflection.

我要做的是编写执行加密和解密的方法public string Encrypt(string data)private string Decrypt(string cipher)

不幸的是,如果有人知道 .NET 框架,他可以使用它Reflection来查找Decrypt方法并解密所有加密的内容。

这似乎不是那么安全。所以我想把Decrypt方法变成真正的私有方法。

但是怎么做呢?


悉尼时间 2012 年 1 月 9 日晚上 10:52 更新

bdares提供了这个问题的技术解释

Eric Lippert提供了这个问题的政治解释

谢谢两位专家!

4

5 回答 5

16

你不能。如果攻击者可以访问您的代码、编译或源代码,他可以跟踪您的程序并找到它被加密或解密的位置。

您可以通过将密钥存储在单独的位置来添加一层安全性,但通常如果攻击者正在您的服务器上执行代码,那么您已经被搞砸了。

(如果攻击者在您的服务器上执行代码,您只会担心这一点,因为否则方法是否私有无关紧要。此外,除非他正在执行代码,否则他不能使用反射来查找方法名称您的服务器。 简而言之:您在这里担心的是错误的事情。

于 2012-01-09T06:17:02.303 回答
15

您的根本问题是您的信任模型错误。如果有人可以使用反射,那么他们就是用户。您是软件提供商。你为他们工作。 信任来自他们,而不是来自你。他们是必须信任的人,而不是你他们

如果您不信任用户,那么首先不要向他们出售您的软件。不要向您认为计划攻击您的人出售武器。

于 2012-01-09T06:32:19.413 回答
2

我相信您指的是混淆,这是在诸如 Reflector 之类的程序中打开时试图隐藏/伪装代码不被人类阅读。Visual Studio 中提供了 PreEmptive Solutions dotfuscator 的社区使用许可证,它将在小型项目以及 Windows Phone 项目(如果您下载附加组件)中提供此功能。也有来自同一供应商和其他供应商的商业平台。

这篇博文解释了更多

于 2012-01-09T06:21:01.717 回答
1

如果您正在创建自己的加密方法,那么您做错了。比您或我更了解加密的人已经提出了出色的加密方法,并且 MS 已经实现了其中的大部分。

对于良好的加密,使加密安全的是密钥,而不是方法。保持密钥安全,算法可以(并且应该)发布给所有人看。

如果您尝试分发这两种内容并对其进行加密,也就是 DRM,那么您很可能注定要失败,除非您可以将密钥很好地隐藏在硬件中,即使这样也只会为您争取一些时间——也许几个月,也许几年。

于 2012-01-09T06:22:53.340 回答
0

我不确定您的确切应用程序。但是,如果您向将在自己的系统上同时进行加密和解密的客户销售产品,那么就无法对他们保密。但是您可以改为允许他们生成新的私钥供自己使用。这样,每个客户的数据对于其他客户来说都是“安全的”;尽管在同一个客户的站点内显然仍然不那么安全。在您控制加密内容的其他情况下,您还可以考虑创建一个在您身边生成的私有主密钥,并且只允许客户拥有一个公钥。

于 2012-01-12T15:25:32.747 回答