(为什么)我应该使用混淆处理?

时间:2020-03-05 18:44:17  来源:igfitidea点击:

在我看来,混淆是一个落入"因模糊而带来的安全"或者"虚假的保护意识"阵营中的想法。为了保护知识产权,这里有版权;为防止发现安全问题,已修复了这些问题。简而言之,我将其视为解决社会问题的技术解决方案。这些几乎永远都行不通。

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

.NET Reactor completely stops any decompiling by mixing any pure .NET assembly (written in C#, VB.NET, Delphi.NET, J#, MSIL...) with native machine code.

因此,基本上,我们一次就放弃了字节码的所有优点吗?

混淆有良好的工程效益吗?

解决方案

回答

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

回答

一种潜在的工程优势是,在某些情况下,混淆可以创建较小的可执行文件或者其他工件,例如。对javascript进行混淆会使文件变小(因为所有变量都被命名为" a"和" b"而不是" descriptiveNameOne",并且所有空格都被去除,等等)。这样可以使使用混淆JavaScript的网页的加载时间更快。显然,这在(.NET)世界中并不适用,但它是一种直接的工程收益的例子。

回答

如果一大批程序员真的想获取源代码,并且花了时间,金钱和精力,那么他们一定会成功。

因此,混淆会阻止那些没有时间,金钱或者精力来获取消息来源的人,路过的人可能会打电话给他们。

回答

虽然与.net不相关,但我会考虑使用Javascript(可能还有其他交错语言)进行混淆。混淆使Java受益匪浅,因为它减少了所需的带宽以及解析器必须读取的令牌。

但是混淆编译后的字节码对我似乎并不那么有用。我的意思是我们会尝试实现什么?我只能看到混淆在许可证检查代码中有点有用,以避免太容易绕开它。

回答

如前所述,使用混淆处理的主要原因是为了保护知识产权。对于企业而言,购买诸如.NET Reactor之类的混淆产品通常比试图合法地保护版权更具成本效益。

混淆还可以提供其他更多附带好处,例如性能提高和装配尺寸减小。这些将为我们提供所需的工程优势。

回答

我们是出于工程原因而询问的,因此这并不是严格意义上的问题答案。但是我认为这是一个有效的说明。

如我们所说,混淆是为了解决社会问题。与技术问题不同,社会(或者业务)问题很少有完整的解决方案。解决或者最小化问题只有成功的程度。

在这种情况下,混淆会给有人反编译和窃取代码增加障碍。它将阻止随意的攻击,并通过惯性降低知识产权被盗的可能性。打个比方,一个防盗锁不能防止汽车被盗,但会减少这种情况。

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

正如GateKiller所说的那样,混淆不会阻止一个确定的团队进行反编译,但是(取决于产品是什么)一个团队有多确定要攻击我们?

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

回答

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

在程序仍然拥有信息时,请使用混淆处理来保护信息。

回答

我在讨论一些问题时发布了一个可能对我们有所帮助的问题:
我应该担心混淆我的网络代码