事实上,私有方法是在C#中实现的,仍然可以使用Reflection
进行搜索。
我要做的是编写public string Encrypt(string data)
和private string Decrypt(string cipher)
方法来执行加密和解密。
不幸的是,如果有人知道.NET框架,他可以使用Reflection
来找到Decrypt
方法,它可以解密所有加密的内容。
这似乎没有那么安全。所以我想把Decrypt
方法变成真正的私有方法。
但是该怎么做呢?
更新日期:2012年1月9日上午10:52悉尼时间
bdares提供了该问题的技术解释
Eric Lippert对这个问题提供了政治解释
感谢两位专家!
你不能。如果攻击者可以访问您的代码、编译的代码或源代码,他可以跟踪您的程序并找到加密或解密的位置。
您可以通过将密钥存储在单独的位置来添加一层安全性,但通常情况下,如果攻击者在您的服务器上执行代码,您就已经完蛋了。
(只有当攻击者在你的服务器上执行代码时,你才会担心这一点,因为否则,方法是否是私有的都无关紧要。此外,除非他在你的服务上执行代码,否则他无法使用反射来查找方法名称。简言之:你在这里担心的是错误的事情。)
您的根本问题是信任模型错误。如果有人可以使用反射,那么他们就是用户。您是软件提供商你为他们工作信任来自他们,而不是来自您。他们是必须信任你的人,而不是你他们。
如果你不信任用户,那么一开始就不要向他们出售你的软件
我相信你指的是模糊处理,这是一种在Reflector等程序中打开代码时试图隐藏/伪装代码以防止人类读取的行为。Visual Studio中提供的是PreEmptive Solutions dotfuscator的社区使用许可证,该许可证将在小型项目和Windows Phone项目中提供此功能(如果下载加载项)。同样也有来自同一供应商和其他供应商的商业平台。
这篇博客文章解释了更多。
如果您正在创建自己的加密方法,则说明您做得不对。比你或我更了解加密的人已经提出了优秀的加密方法,MS已经实现了其中的大部分。
对于良好的加密,使加密安全的是密钥,而不是方法。确保密钥的安全,算法可以(也应该)发布给所有人看。
如果你试图分发这两种内容并对其进行加密,也就是DRM,那么你很可能注定会失败,除非你能很好地将密钥隐藏在硬件中,即使这样也只会为你争取一些时间——也许几个月,也许几年。
我不确定您的确切应用程序。但是,如果你向客户销售产品,而客户将在自己的系统上同时进行加密和解密,那么就没有办法对他们保密。但你可以允许他们生成一个新的私钥供自己使用。通过这种方式,每个客户的数据相对于其他客户是"安全的";尽管在同一客户的网站内显然仍然不那么安全。在控制加密内容的其他情况下,您也可以考虑创建一个私人主密钥,由您自己生成,只允许客户拥有公钥。