8

在我看来,混淆是一种属于“默默无闻的安全”或“虚假的保护意识”阵营的想法。保护知识产权,有版权;为了防止发现安全问题,我们正在修复这些问题。简而言之,我将其视为解决社会问题的技术解决方案。那些几乎从不工作。

然而,我似乎是我们开发团队中唯一有这种感觉的人,所以我要么错了,要么只需要令人信服的论据。我们的产品使用 .NET,一位开发人员建议使用 .NET Reactor(顺便提一下,在这个 SO 线程中也提出了建议)。

.NET Reactor 通过将任何纯 .NET 程序集(用 C#、VB.NET、Delphi.NET、J#、MSIL...编写)与本机机器代码混合,完全停止任何反编译。

所以,基本上,你一次就把字节码的所有优点都扔掉了吗?

混淆是否有良好的工程优势?

4

8 回答 8

13

你问的是工程原因,所以严格来说这不是问题的答案。但我认为这是一个有效的澄清。

正如您所说,混淆旨在解决社会问题。与技术问题不同,社会(或商业)问题很少有完整的解决方案。在解决或最小化问题方面只有一定程度的成功。

在这种情况下,混淆会提高有人反编译和窃取您的代码的障碍。它会阻止随意的攻击,并通过惯性降低您的知识产权被盗的可能性。打个令人厌烦的类比,防盗锁并不能防止你的车被盗,但它会降低它的可能性。

当然,在可维护性、(可能)性能方面以及最重要的是使用户更难准确提交错误报告是有成本的。

正如 GateKiller 所说,混淆不会阻止一个有决心的团队进行反编译,但是(这取决于你的产品)一个团队可能会攻击你吗?

因此,这不是对社会问题的技术解决方案,而是为复杂的社会结构增加一种影响的技术决策。

于 2008-08-28T09:28:11.703 回答
6

如果一大群程序员真的想获得你的源代码并且有时间、金钱和精力,那么他们就会成功。

因此,混淆应该阻止那些没有时间、金钱或精力来获取您的来源的人,您可能会打电话给他们。

于 2008-08-28T09:14:05.370 回答
4

如果您坚持纯托管代码混淆,您可以削减相当多的程序集大小,并且混淆的类/函数名称(折叠为单个字母)意味着更小的内存占用。这几乎总是可以忽略不计,但对某些移动/嵌入式设备(尽管主要在 java 中)确实有影响(并被使用)。

于 2008-08-28T09:13:09.413 回答
3

一个潜在的工程好处是,在某些情况下,混淆可以创建更小的可执行文件或其他工件——例如,混淆 javascript 会产生更小的文件(因为所有变量都被命名为“a”和“b”而不是“descriptiveNameOne”并且所有的空格被剥离等)。这会加快使用混淆 javascript 的网页的加载时间。显然,这在 .NET 世界中并不适用(同样多),但它是一个具有直接工程优势的情况的示例。

于 2008-08-28T09:13:35.183 回答
2

虽然与 .net 无关,但我会考虑在 Javascript 中进行混淆,可能还有其他相互干扰的语言。Javascript 从混淆中受益匪浅,因为它减少了所需的带宽,以及解析器必须读取的标记。

但是混淆编译的字节码对我来说似乎并没有那么有用。我的意思是你会尝试和实现什么?我只能看到混淆在许可证检查代码中稍微有用,以避免它太容易被规避。

于 2008-08-28T09:16:51.760 回答
2

正如您所指出的,使用混淆的主要原因是保护知识产权。对于企业而言,购买 .NET Reactor 之类的混淆产品通常比尝试合法地执行您的版权更具成本效益。

混淆还可以提供其他更附带的好处,例如性能改进和程序集尺寸减小。这些将是您正在寻找的工程优势。

于 2008-08-28T09:17:18.500 回答
2

我发布了一个可能对您有所帮助的问题,因为它讨论了一些问题: should-i-be-worried-about-obfuscating-my-net-code

于 2008-08-28T10:26:47.693 回答
1

使用加密来保护途中的信息。

在您的程序仍然拥有信息时使用混淆来保护信息。

于 2008-08-28T09:41:12.777 回答