为什么要加密JAVA代码?

   
    通过 java 反编译⼯具可以很容易的把 java class ⽂件还原成 java 源代码, java 应⽤的知识产权就不能得到保障。
  在现实情况中,可能会采⽤加密或混淆技术保护⾃⼰的源代码, 但从技术⻆度讲, 没有绝对的安全, 加密和反加密始终是⼀个正反⽅持续对抗的过程。 这⾥仅从技术⻆度对⽐分析⼀下常⻅的保护措施。

加密JAVA代码有哪些技术

通过加壳⼯具把Java⽂件打包成可执⾏程序

  特点: 将 jar 包装成可执⾏⽂件, 在执⾏时释放到临时⽬录利⽤内嵌的 jdk 执⾏业务逻辑,其对 java 程序没有任何保护。
   常⽤的⼯具包含 exe4j jsmooth NativeJ 等, java jar 包⼀般可以从临时⽬录⾥找到,或者直接⽤ winrar ⼯具解压获取到。
  如果⾃⼰实现这种功能,⼀般情况下可以通过 c 语⾔调⽤ jvm 变成⼀个可执⾏⽂件,保护效果不理想。

预先编译技术 (AOT

特点: 将 Java 代码静态编译成真正的本地机器码独⽴执⾏,不需要依赖任何 jdk
 典型的代表包括 GNU gcj Oracle 实验项⽬ graalvm (native-image) , 由于 java 社区⽣态各种组件⾮常丰富, 这些⼯具还不能很好的⽀持把各种实际项⽬编译成可执⾏程序。⽐如, GraalVM 是基于 java 字节码翻译成本地可执⾏程序,但很多项⽬使⽤了动态代理或者动态字节码等技术,这种字节码静 态翻译的技术将⽆法把此类应⽤编译成可执⾏程序。

基于类加载(classloader)的加密保护技术

特点:加密原始的 java class ⽂件,并通过⾃定义的 classloader 完成解密和加载过程。
在真实场景中,⼀般使⽤了 spring boot 技术,它本身就是⾃定义了 classloader 实现了应⽤的启动,其中,像 tomcat web 服务器应⽤⾃身也实现了 classloader , 实现加密的 classloader ⽐较容易与各种不同的 classloader 技术冲突, 更何况 spring boot tomcat 本身还有不同的版本,有些应⽤程序本 身还可能⾃定义⾃⼰的classloader ,上述这些因素都会增加基于 classloader 的技术复杂度并带来潜在的⻛险。

Java字节码混淆技术

特点: 将 java 类名、⽅法名、属性名替换成⽆意义符号,增加代码逆向难度,把字符串加密,程序结构不改变逻辑的前提下打乱混排,降低代码可读性,修改增加字节码让代码不易被反编译,反编译后难以理解与阅读。
   潜在的问题就是类名、⽅法名和属性名的改变可能导致 Mybatis ,序列化( jackson gson xstream 等), RPC 调⽤等场景不能正确正常⼯作。

基于java agent的加密保护技术

特点:将原始java class⽂件加密另存,清空jar包⾥⾯的java class的⽅法体内容,不影响classloader的正常⼯作,然后利⽤jvm提供的agent技术动态解密还原java class类,替换掉只有空⽅法体的Java类,不影响正常业务逻辑。


推荐阅读

研发体系最佳实践-本地开发流水线

DDD主要概念以及之间的关系

Logo

更多推荐