如何保护C#代码免受修改

时间:2012-03-07 15:48:22

标签: c# .net protection

需要保护某些程序集不被修改(换句话说,如何确定在编译后是否修改了程序集二进制文件)。如何通过内置的.NET在.NET 4.0中实现这一点?

问题仅在于dll文件修改检测,而不是防止反编译,逆向工程等。

5 个答案:

答案 0 :(得分:3)

可悲的是,强名称为消费者提供保护。它们没有为程序集的开发人员提供保护,即他们的代码未被修改。 remove一个strong name是微不足道的。删除后,可以根据需要进行修改。

即使是为消费者提供的保护也受限于强名称。由于没有公钥的中央注册表,因此无法知道程序集是由特定发布者签名的。黑客可以在修改后更改签名并使用自己的密钥重新签名。实际上,强名称实际上只能防止黑客修改系统运行时库...即便如此,我也不确定它们对系统的实际攻击有多么有效。

由于代码即使在强名称时也可以easily modified,因此在您自己的代码中添加某种简单的哈希检查不会提供任何额外的保护。唯一有希望的方法是使用提供software protection tool的专业成绩tamper detection

答案 1 :(得分:2)

你们可以使用强名称的装配(见HERE) 它们附有公钥和数字签名,一旦被更改,它们将不再由JIT加载:

  

强名称提供强大的完整性检查。传递.NET   框架安全检查保证了程序集的内容   自建成以来没有改变过。

但史蒂夫提到它并不是绝对安全的!

答案 2 :(得分:0)

我建议在编译时对程序集进行哈希处理。将它存储在应用程序中的某个位置,并在运行时使用新计算的程序集散列进行检查。

正如@Steve建议的(以及其他人)使用它的过程被称为“强命名程序集”

答案 3 :(得分:0)

Strong name signing your DLL并使用引用的完全限定名称(包括签名)应该有助于此。

这不是万无一失的 - 有人总是可以反汇编DLL而不是任何其他使用它的应用程序,并将这些引用更新到他们新版本的DLL。

答案 4 :(得分:0)

尝试对程序集进行数字签名。要了解更多信息,请查看MSDN杂志的Using Strong Name Signatures文章。