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

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

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

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

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

但是怎么做呢?


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

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

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

谢谢两位专家!

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

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

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

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

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

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

这篇博客文章解释了一点 。

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

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

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

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