【发布时间】:2012-02-16 19:17:40
【问题描述】:
我已将知识产权编码到最终用户计算机上的 .net 2.0 完全受信任的程序集(.exe + DLL)中,我想保护它免受黑客攻击/反向工程(Web 服务/云计算解决方案)不是一种选择)。以下是我为实现这一目标而收集的一系列技术。
我的问题是:
- 我的假设是否正确,或者我在一项或多项技术中做错了什么?
- 此列表是否足以防止恶意攻击,还是我应该添加其他保护措施?
提前致谢。
--
建议的技巧
- 使用相同的强名称密钥签署所有程序集。
这有两个好处:- A.确保对程序集的任何修改都会使其无用,
- 乙。所有程序集都将具有相同的公钥,它们可以通过该公钥相互识别。
- 对程序集进行数字签名:两者都让用户知道执行的代码来自正确的源,并且 - 添加另一个标识组件,程序集可以通过该组件相互识别。
- 通过爬取调用堆栈并验证所有调用者都在“社区”内来执行上述操作。
可能的线索:- Hallgrim 在this S.O. thread 中的想法。
- Daniel Brückner 在this S.O. thread 中的补充。
- 这个.Net Security Blog Post,结合了这两种解决方案。
- 使用 AOP(例如 Spring.NET)将调用堆栈爬取代码注入到部分/所有方法中。
- 这主要是因为在 .net 程序集中没有单一入口点(如 Win32 DLL 的 DllMain())。
- 对所有程序集进行模糊处理,以阻止逆向工程和反射执行尝试(当然,在模糊处理后会执行强名称签名)。
- 集成System.ComponentModel.LicenseProvider 机制。
- 利用“InternalsVisibleTo”程序集级属性在预定义的程序集中公开内部。
- 可能使用 NGEN 将解决方案转换为本机代码。
需要考虑的要点
- 实施上述部分或全部内容很可能会导致性能损失,因此应谨慎处理时间关键型处理等问题。
- CAS 似乎与这种类型的完全受信任的程序集无关。
【问题讨论】:
-
这不是博客。请遵循发布指南(摘自常见问题解答):“您应该只根据您面临的实际问题提出实用、可回答的问题。闲聊、开放式问题会降低我们网站的实用性,并将其他问题推到首页。 "
-
“这不是一篇单一/最佳答案类型的文章。”那么 StackOverflow不是此类帮助的最佳位置。
-
点了,我会改写问题。
-
你的重点是什么?确保没有人知道你的程序是如何做某事的?确保没有人修改行为(即代码更改或完全替换程序集)?
-
两者兼而有之。我想防止对代码的任何恶意攻击(例如伪装成我的一个的第 3 方程序集);代码篡改(修改行为);确保没有人可以引用/执行代码;并防止实施被逆向工程。简而言之 - 在各个方面为组件提供最大程度的保护。