混淆应用程序是否存在任何潜在问题?

mrb*_*lah 3 java obfuscation spring

我正在构建一个spring mvc web应用程序.我打算使用hibernate.

我对混淆等方面没有多少经验

混淆应用程序的潜在缺点是什么?

我知道调试应用程序可能存在问题,并且恢复丢失的源代码也是一个问题.

实际运行应用程序是否存在任何已知问题?可以引入错误吗?

由于这是我正在寻找一般指导的领域,请随时打开我应该注意的任何问题.

Nei*_*fey 8

肯定存在一些潜在的性能/维护问题,但是一个好的混淆器可以让你至少绕过其中一些.需要注意的事项:

  • 一个显而易见的问题:如果您的代码通过反射调用方法或动态加载类,那么如果类/方法名称被混淆,则可能会失败; 一个好的混淆器会让你选择类/方法名称不要混淆以解决这个问题;
  • 如果并非所有应用程序都是同时编译,则会出现类似问题;
  • 如果它直接处理字节码级别,则混淆器可以创建原则上Java编译器无法创建的代码(例如,它可以插入任意GOTO指令,而从Java中这些只能作为循环的一部分创建) - 这可能是有点理论,但如果我正在编写JVM,我会优化Java编译器可以创建的字节码序列的性能,而不是它不能创建的字节码序列......
  • 如果混淆器显着改变方法中的字节码数量,或者以某种方式改变某个给定方法/代码段是否达到某些JVM优化的阈值(例如,"内联方法",那么混淆器可能会对性能进行其他微妙的更改. X字节码").

但正如您所看到的,其中一些影响有点微妙和理论 - 所以在某种程度上,您需要做的是在混淆后对应用程序进行浸泡测试,就像您对其他任何重大更改一样.

您还应该注意不要假设混淆隐藏您的代码/算法(如果这是您的意图),就像您希望的那样 - 使用反编译器来查看生成的混淆类的内容.


Blu*_*eft 7

惊讶没有人提到速度 - 一般来说,更混淆=运行速度较慢的代码


[编辑]我不敢相信这有-2.这是一个正确的答案.

缩短标识符和删除未使用的方法将减小文件大小,但对运行速度有0影响(除了从加载时间削减的几纳秒).同时,程序的大多数混淆来自添加的代码:

  • 将1方法分解为5; 交错方法; 合并类[聚合转换]
  • 将1个算术表达式拆分为10个; 混淆控制流[计算转换]
  • 并添加不执行任何操作的代码块[opaque predicates]

是所有常见的混淆技术,导致程序运行较慢.