(Why) should I use obfuscation?在我看来,混淆是一个落入"因模糊而带来的安全"或"虚假的保护意识"阵营中的想法。 为了保护知识产权,这里有版权; 为防止发现安全问题,已修复了这些问题。 简而言之,我认为这是解决社会问题的技术解决方案。 这些几乎永远都行不通。 但是,我似乎是开发团队中唯一有这种感觉的人,所以我错了,或者只需要令人信服的论点。 我们的产品使用.NET,并且有一位开发人员建议使用.NET Reactor(顺便提一下,在此SO线程中也建议使用)。
因此,基本上,您一次就放弃了字节码的所有优点吗? 混淆有良好的工程效益吗? 您是出于工程原因而询问的,因此这并不是严格意义上的问题答案。但是我认为这是一个有效的说明。 如您所说,混淆是为了解决社会问题。与技术问题不同,社会(或商业)问题很少有完整的解决方案。解决或最小化问题只有成功的程度。 在这种情况下,混淆会给有人反编译和窃取您的代码增加障碍。它将阻止偶然的攻击,并通过惯性降低您的知识产权被盗的可能性。打个比方,轮胎防盗器并不能防止汽车被盗,但会降低汽车被盗的可能性。 当然,在可维护性方面(可能)在性能上存在成本,最重要的是使用户更难以准确提交错误报告。 正如GateKiller所说,混淆不会阻止一支坚定的团队进行反编译,而是(取决于您的产品)(取决于您的产品)一支团队可能在攻击您的决心如何? 因此,这不是解决社会问题的技术方案,而是一项对复杂社会结构增加影响力的技术决策。 如果一大批程序员真的想获取您的源代码并且花了时间,金钱和精力,那么他们一定会成功。 因此,混淆应该阻止那些没有时间,金钱或精力来获取您的消息来源的人,路过的人可能会打电话给他们。 如果坚持纯托管代码混淆,则可以减少相当大的程序集大小,而混淆的类/函数名称(折叠为单个字母)意味着较小的内存占用。这几乎总是可以忽略不计的,但是确实对某些移动/嵌入式设备有影响(并已被使用)(尽管大多数情况下使用Java)。 一种潜在的工程优势是,在某些情况下,混淆可以创建较小的可执行文件或其他工件-例如,对javascript进行混淆会使文件变小(因为所有变量都被命名为" a"和" b",而不是" descriptiveNameOne",并且所有空格都被去除,等等)。这样可以使使用混淆JavaScript的网页的加载时间更快。显然,这在(.NET)世界中并不适用,但它是一种直接的工程收益的例子。
我在讨论一些问题时发布了一个可能对您有所帮助的问题: 如前所述,使用混淆处理的主要原因是为了保护知识产权。对于企业而言,购买诸如.NET Reactor之类的混淆产品通常比试图合法地保护您的版权更具成本效益。 混淆还可以提供其他更多附带好处,例如性能改进和装配尺寸减小。这些将为您提供所需的工程优势。 虽然与.net不相关,但我会考虑使用Javascript(可能还有其他交错语言)进行混淆。混淆使Java受益匪浅,因为它减少了所需的带宽以及解析器必须读取的令牌。 但是混淆编译后的字节码对我似乎并不那么有用。我的意思是你会尝试实现什么?我只能看到混淆蜂在许可证检查代码中有点有用,以避免太容易绕开它。 使用加密来保护途中的信息。 在程序仍然拥有信息时,请使用混淆处理来保护信息。 |