.Net程序集安全-防止黑客攻击/反向工程

本文关键字:攻击 黑客 安全 程序集 Net | 更新日期: 2023-09-27 18:24:49

我将知识产权编码到最终用户机器上的.net 2.0完全可信程序集(.exe+DLL)中,我希望保护这些程序集不被黑客入侵/逆向工程(WebService/云计算解决方案不是一种选择)。以下是我为达到这个目标而收集的技巧列表。

我的问题是:

  1. 我的假设是正确的,还是我在一种或多种技术上做错了什么
  2. 这个列表足以防止恶意攻击吗?或者我应该添加其他保护措施吗

提前谢谢。

--

建议的技术

  1. 使用相同的强名称密钥对所有程序集进行签名
    这有两个好处:
    • A。确保对程序集的任何修改都会使其变得无用
    • B。所有程序集都将具有相同的公钥,通过该公钥可以相互识别
  2. 对程序集进行数字签名:两者都让用户知道执行的代码来自正确的源,并添加另一个标识组件,程序集可以通过该组件相互标识
  3. 通过向上爬取调用堆栈并验证所有调用方都在"社区"中,来强制执行上述操作
    可能的线索:
    • Hallgrim在这个s.O.线程中的想法
    • Daniel Brückner在这个s.O.线程中的添加
    • 这篇.Net安全博客文章结合了这两种解决方案
  4. 使用AOP(例如Spring.NET)将调用堆栈爬网代码注入某些/所有方法。
    • 之所以这样做,主要是因为.net程序集中没有单个入口点(如Win32 DLL的DllMain())
  5. 混淆所有程序集,以阻碍反向工程和反射执行尝试(当然,混淆后将执行强名称签名)
  6. 集成System.ComponentModel.LicenseProvider机制
  7. 使用"InternalsVisibleTo"程序集级别属性可以公开预定义程序集之间的内部
  8. 可能使用NGEN将解决方案转换为本机代码

需要考虑的要点

  • 实现上述部分或全部内容很可能会带来性能损失,因此,例如,应谨慎处理时间关键型处理
  • CAS似乎与此类型的完全受信任程序集无关

.Net程序集安全-防止黑客攻击/反向工程

恐怕您无法获得所需的所有安全性。你看,这是这些使用迭代中介语言的语言/平台的问题。它必须采用所有运行时实现都可以使用的格式,然后生成本机代码。

我看过一些关于篡改签名程序集的博客文章。我还没有试过,但我认为它有效。除此之外,模糊处理工具只会让提取代码变得更加困难,但并非不可能(尽管有一些非常好的工具会让提取变得非常困难)。NGEN并不支持这一点。您仍然需要分发原始程序集。

我认为保护代码最有效、最安全的方法是将其转移到无法反编译的技术,例如,将敏感代码转移到非托管C++,并在C#代码上使用DLLImport。

这并不意味着你不应该试图保护你的代码,但你应该记住,你不会受到100%的保护。如果你负担不起用另一种语言重写敏感代码的费用,那就使用模糊处理和签名。你再也找不到比这更安全的了。