我最近参加了一个演示,其中有人展示了 .NET 混淆代码可以被破解。他建议获得真正安全性的更好方法是加密混淆程序集,或者更好地将您的知识产权放在非托管程序集中。非托管程序集路径的明显缺点是程序集将是特定于平台的。以上两种方法是否有任何优点或缺点。
4 回答
您对这种级别的代码安全性的动机是什么?
如果您的代码本身确实是足够有价值的 IP,那么也许您应该考虑根本不分发它,而是将其隐藏在某种 SaaS 产品后面。混淆正是它所说的,它不是加密,并且由于运行时必须能够读取您的代码才能运行它,所以它不可避免地必须是可读的。即使是非托管的 DLL 也可以被反编译,即使只是汇编代码,所以你的 IP 在那里并不完全安全。
顺便说一句,非托管代码的明显缺点不是您所说的,恕我直言,而是您在从托管语言迁移到非托管语言时所牺牲的一切。
两种模型都有优点和缺点。但这些主要取决于您的特定威胁模型,我建议您从这里开始。哪些人群对您的产品构成安全威胁,这些威胁是什么?
一般来说,使用托管代码的优势是上市速度快,但它更容易受到某些攻击和 IP 盗窃。使用本机代码的优势在于它不太容易受到某些攻击,但上市速度较慢。这些是非常普遍的优点和缺点,应根据您的威胁模型进行调整。
编辑以回答您的评论。如果您确实有需要保护的 IP,我会(在一般情况下)选择本机代码可执行文件,而不是加密的混淆程序集。本机代码比加密的混淆托管代码更难破解,加密和混淆的额外复杂性将为您的产品增加大量的设计和测试。
再次编辑指出还有另一种选择:您可以使用像MPress这样的打包程序。这没有混淆和/或加密的性能和复杂性影响,但仍提供合理的保护,防止非专业破解者盗窃 IP。如果您使用 Reflector 查看打包的 .NET 程序集,您只会看到一个 Main 调用。
第三种选择是加密您的可执行文件。我最熟悉的选项将加密代码放在一个包装器中,只有在存在加密狗时才能解密它。
加密狗和加密理论上更强大,因为在可执行文件被解密之前,人们甚至无法开始对程序进行探索。也就是说,每次程序运行时都必须对其进行解密,因此您真正需要做的就是运行程序并从内存中提取清晰的代码。但是,无法访问您的加密狗之一的人将无法使用该选项,因此您有机会判断您愿意将加密狗运送给谁。
缺点是成本支持麻烦。软件不能以电子方式交付,因为现在有一块客户需要的物理硬件。一些国家/地区可能有关于进口或出口加密狗的规定,因为它们是加密设备。并且一些管理程序系统不支持 USB 直通,虽然一些加密狗制造商仍然提供并行端口加密狗,但现在计算机硬件不一定配备并行端口。如果客户需要在虚拟服务器上运行您的软件,您可能会发现自己陷入了困境。而且它们出奇地容易折断。你的客户会破坏他们。
与机器代码相比,.NET 代码的结构更加结构化,转换的灵活性更低。因此,保护 .NET 代码的一项技术挑战是充分打乱代码(使用混淆、加密或其他技术),同时又不破坏 .NET 运行时强加的可验证性。
也就是说,您仍然可以做很多事情来保护 .NET 代码(除了已经提到的技术):
- 应用反反汇编技巧,使代码难以正确反汇编
- 加密代码中使用的字符串文字
- 将函数和数据符号重命名为无意义的名称
- 故意在文件级别损坏部分代码,但只在运行时修复
- 校验和重要逻辑,以防止篡改
- 分层应用保护(例如,校验和并修复混淆代码和其他保护逻辑),因此更难从整体上破坏保护
当然,手工做这些是困难的并且容易出错。但是,您可以使用商业、专业级的工具来自动执行此类保护。