2012-02-16 54 views
3

我在最终用户机器上将知识产权编码为.net 2.0完全受信任的程序集(.exe + dll),我希望避免被黑客攻击/反向工程(WebService /云计算解决方案不是一种选择)。以下是我为了实现此目标而收集的技术列表。.Net程序集安全 - 防止黑客攻击/反向工程

我的问题是:

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

在此先感谢。

-

建议的方法

  1. 注册使用相同的强名称密钥的所有组件。
    这有两个好处:
    • A.确保任何修改组件将使其无效,
    • B.所有组件将具有相同的公钥,通过它们可以相互识别。
  2. 对程序集进行数字签名:两者都让用户知道执行的代码来自正确的源代码,并且 - 添加另一个标识组件,通过该组件可以识别对方。
  3. 通过抓取调用堆栈并验证所有调用者在“社区”中来强制执行上述操作。
    可能的潜在客户:
  4. 使用AOP(例如Spring.NET)将调用堆栈搜寻代码注入某些/所有方法。
    • 这主要是因为在.NET程序集中没有单个入口点(如Win32 DLL的DllMain())。
  5. 混淆所有程序集以阻止反向工程和反射执行尝试(强制名称签名将在混淆后执行)。
  6. 集成System.ComponentModel.LicenseProvider机制。
  7. 利用“InternalsVisibleTo”程序集级别属性为了在预定义的程序集集中公开内部信息。
  8. 可能使用NGEN将解决方案转换为本地代码。

要考虑的问题

  • 实现上述将最有可能引入性能损失,所以对时间要求严格的处理,例如,应小心处理的部分或全部。
  • 对于这种完全信任的程序集,CAS似乎并不重要。
+5

这不是博客。请遵循发布指南(摘自常见问题解答):“您应该只根据您面临的实际问题提出实际的,可回答的问题。聊天,开放式问题会降低我们网站的实用性,并将其他问题推到首页。 “ – Joe 2012-02-16 19:19:58

+0

“这不是单一/最佳答案类型的文章。”然后,StackOverflow *不是这种帮助的最佳位置。 – Joe 2012-02-16 23:54:53

+0

需要采取的措施,我将重新说明这个问题。 – AVIDeveloper 2012-02-17 00:25:53

回答

2

恐怕你不会得到你想要的所有安全。你看,这是使用中间语言的这些语言/平台的问题。它必须采用所有运行时实现可以使用的格式,然后生成本机代码。

我见过一些关于篡改签署程序集的博客文章。我还没有尝试,但我认为它的作品。除此之外,混淆工具只会让它变得更难,但并非不可能提取代码(尽管有一些相当不错的工具会使其变得非常困难)。 NGEN不是那样的。您仍然有分发原始程序集。

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

这并不意味着你不应该试图保护你的代码,但你应该记住,你不会100%的保护。如果您无法用其他语言重写敏感代码,请使用混淆和签名。你不能比这更安全。

+0

+1用于在非托管C++中编写敏感代码。您对代码执行的预防有什么经验/想法? – AVIDeveloper 2012-02-17 19:28:35

+0

将您的类型标记为内部并使用InternalsVisibleTo可以帮助您。如果我没有错,它会阻止通过反射来实例化。如果没有,你可以这样做(警告臭的代码!):class MyClass {public MyClass(){if(typeof(MyClass).Assembly.GetName()。GetPublicKeyToken()!= Assembly.GetEntryAssembly()。GetName ).GetPublicKeyToken()){抛出新的异常(“抱歉,伙计”);}}}但是,再次,你不会100%安全。尽管大多数人都会放弃,但它可能会让人很难欺骗。而一个很好的混淆器会让API很难理解。 – Fernando 2012-02-17 21:01:07

+0

这就是我正在考虑的方向。为什么它是臭编码,什么使它不是100%安全? – AVIDeveloper 2012-02-17 21:17:57