保护JAVA代码常见技术
Java代码加密的必要性与技术分析 摘要:Java代码易被反编译的特性使得知识产权保护成为必要。目前主流的加密技术包括:1)加壳工具打包成可执行程序,但保护效果有限;2)AOT编译技术将代码转为本地机器码,但对动态特性支持不足;3)基于类加载器的加密技术,但易与框架自带的类加载器冲突;4)字节码混淆技术,虽增加逆向难度但可能影响框架功能;5)JavaAgent技术,通过动态解密实现保护。这些技术各
·
为什么要加密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类,不影响正常业务逻辑。
推荐阅读
更多推荐



所有评论(0)