在我看来,混淆是一种落入“默默无闻”或“虚假保护”阵营的想法。为保护知识产权,有版权;为了防止发现安全问题,修复了这些问题。简而言之,我认为它是解决社会问题的技术方案。 Those almost never work.
然而,我似乎是我们开发团队中唯一一个有这种感觉的人,所以我要么错了,要么只需要令人信服的论据。我们的产品使用.NET,一个开发人员建议使用.NET Reactor(顺便提一下,was suggested in this SO thread as well)。
.NET Reactor通过将任何纯.NET程序集(用C#,VB.NET,Delphi.NET,J#,MSIL ...编写)与本机代码混合来完全停止任何反编译。
所以,基本上,你一次性抛弃字节码的所有优点?
混淆是否有很好的工程好处?
答案 0 :(得分:13)
你问工程原因,所以严格来说这并不是问题的答案。但我认为这是一个有效的澄清。
正如您所说,混淆旨在解决社会问题。与技术问题不同,社交(或业务)问题很少有完整的解决方案。在解决或最小化问题方面只取得了一定程度的成功。
在这种情况下,混淆会增加某人反编译和窃取代码的障碍。它会阻止偶然攻击,并且通过惯性,可能会使您的知识产权不太可能被盗。为了做一个无聊的比喻,一个防盗装置不会阻止你的汽车被盗,但它会降低它的可能性。
当然,可维护性(可能)在性能方面存在成本,最重要的是使用户更难以准确地提交错误报告。
正如GateKiller所说,混淆不会阻止一个坚定的团队反编译,但(并且这取决于你的产品是什么)团队可能会如何决定攻击你?
因此,这不是社会问题的技术解决方案,而是一项技术决策,它会给复杂的社会结构带来一种影响。
答案 1 :(得分:6)
如果一个庞大的程序员团队真的想要获得你的源代码并且有时间,金钱和努力,那么他们就会成功。
因此,混淆应该阻止那些没有时间,金钱或精力来获取你的消息来源的人,你可以给他们打电话。答案 2 :(得分:4)
如果您坚持纯托管代码混淆,您可以削减相当多的程序集大小,混淆的类/函数名称(折叠为单个字母)意味着更小的内存占用。这几乎总是可以忽略不计,但确实会对某些移动/嵌入式设备产生影响(并且会被使用)(尽管主要是在java中)。
答案 3 :(得分:3)
一个潜在的工程优势是,在某些情况下,混淆可能会创建较小的可执行文件或其他工件 - 例如混淆javascript导致较小的文件(因为所有变量都被命名为“a”和“b”而不是“descriptiveNameOne”并且所有空格都被剥离等)。这会导致使用混淆javascript的网页加载时间更短。显然,这不适用于.NET世界,但它是一个直接的工程优势的例子。
答案 4 :(得分:2)
虽然与.net无关,但我会考虑使用Javascript中的混淆,以及其他可能混合的语言。 Javascript可以从混淆中获益,因为它减少了所需的带宽,以及解析器必须读取的标记。
但是混淆编译的字节码对我来说似乎并不那么有用。我的意思是你会尝试和实现什么?我只能看到在许可证检查代码中稍微有用的混淆,以避免它太容易被规避。
答案 5 :(得分:2)
使用混淆的主要原因是保护知识产权,如您所示。对于企业而言,购买像.NET Reactor这样的混淆产品通常比试图合法地执行您的版权更具成本效益。
混淆还可以提供其他更多附带好处,例如性能改进和装配尺寸减小。这些将是您正在寻找的工程好处。
答案 6 :(得分:2)
我发布了一个可能对您有所帮助的问题,因为它讨论了一些问题: should-i-be-worried-about-obfuscating-my-net-code
答案 7 :(得分:1)
使用加密来保护路上的信息。
在程序仍然使用时,使用模糊处理来保护信息。