如何在C#中编写一个“真正的”私有方法?

时间:2012-01-09 06:15:12

标签: c# reflection private-methods truecrypt

实际上,私有方法是在C#中实现的,仍然可以使用Reflection进行搜索。

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

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

似乎不那么安全。所以我想将Decrypt方法设为真正的私有方法。

但是怎么做?


2012年1月9日更新时间悉尼时间下午10:52

bdares 提供此问题的技术解释

Eric Lippert 提供此问题的政治解释

感谢两位专家!

5 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分:15)

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

如果您不信任该用户,那么首先不会将您的软件卖给他们。不要向您认为打算攻击您的人出售武器。

答案 2 :(得分:2)

我相信你指的是obfuscation,这是试图隐藏/伪装代码在Reflector等程序中打开时被人类读取。 在Visual Studio中提供的是PreEmptive Solutions dotfuscator的社区使用许可证,它将在小型项目和Windows Phone项目(如果您下载加载项)上提供此功能。来自同一供应商和其他人也有commercial platforms available

This blog post explains a little more

答案 3 :(得分:1)

如果您正在创建自己的加密方法,那么您做错了。知道更多关于加密的人比你或我已经提出了很好的加密方法,MS已经实现了大部分加密方法。

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

如果你试图分发这两个内容并保持加密,即DRM,你很可能注定要失败,除非你能把密钥保存在硬件中很好,甚至那只会给你带来一些时间 - - 也许是几个月,也许是几年。

答案 4 :(得分:0)

我不确定您的确切申请。但是,如果您将产品销售给将在自己的系统上执行加密和解密的客户,那么就无法保密加密。但您可以让他们生成一个新的私钥供自己使用。通过这种方式,每个客户的数据对于其他客户来说都是“安全的”;虽然在同一客户的网站内显然仍然不那么安全。在您控制加密内容的其他情况下,您还可以考虑创建要在您身边生成的私有主密钥,并且只允许客户拥有公钥。