Java代码防止反编译

今天因为需要,需要对内部的Java代码进行加密保护。由于时间紧迫,于是搜了很多网站。代码保护大家常用的方法大概有如下几种:

1)代码混淆,即使用代码混淆的工具,将程序结构打乱,这样即使源代码被反编译了,仍然很难梳理出程序的正常逻辑结构;

2)代码隔离。即在别的服务器上仅仅存放页面的代码,实际的应用程序访问到自己的服务器上。这种保护效果也比较好,问题就是,如果被部署服务器和访问服务器之间网络无法共通,那么此方法则不可行。

3)本地代码保护,通过本地加密技术动态生成可执行的jar包,将加密之后的应用发布,则在反编译时,需要输入密码,如果无密码,则无法解密。

4)通过加密工具进行加密,之后发布已经加密的包,通过GO语言生成的动态脚本执行启动命令。

今天我使用到的就是第四种,通过GO语言动态生成执行文件的方式启动java程序。

下面就是整个加密解密的过程:

1).通过idea或者Eclipse开发工具,将要部署的源代码打成jar包;

2)单独写一个test方法,执行以下逻辑对生成的jar包进行加密。

XCryptos.encryption() .from( "/XXXX/test.jar" ) .use( "123456" ) .include( "/com/123/**/*.class" ) .include( "/mapper/**/*Mapper.xml" ) .exclude( "/static/**/*" ) .exclude( "/conf/*" ) .to( "XXX/backend-gateway.jar" );

注:其中的from函数中的参数是已经打包好的jar包的绝对路径,to函数中的参数为加密后的jar文件的输出绝对路径;

use函数的参数是加密的密码;

include函数的参数为指定需要加密的class文件

exclude函数为加密时,需要排除的一些静态文件

3)在编译环境中安装GO环境,具体方法可以网上搜索。

4)在输出jar包的目录中有一个xjar.go的文件,用cmd命令行进入到当前目录执行:build go xjar.go

5)windows环境编译完后可得到一个xjar.exe 文件,linux环境的执行脚本问xjar文件;

具体可参考: https://github.com/core-lib/xjar中的方法

6)执行程序启动命令,启动程序。

注意:生成的xjar.exe文件或者linux下的xjar文件,需要与启动脚本放同一目录;

例如:启动本地加密后的jar包:

正常执行启动命令:../boot/Test.jar --spring.config.location=../config/ --safetyuser.isEnableAnsi=false

加密之后的程序启动命令:

C:/Users/Laptop/Desktop/test/Myproject/bin/xjar java -jar ../boot/Test.jar --spring.config.location=../config/ --safetyuser.isEnableAnsi=false

即可启动程序。

注意:加密时所使用的jdk的版本,与启动时所使用的jdk版本应保持一至,否则启动会报如下错误:

Exception in thread "main" java.lang.RuntimeException: java.lang.ClassCastException: jdk.internal.loader.ClassLoaders$AppClassLoader (in module: java.base) cannot be cast to java.net.URLClassLoader (in module: java.base)

若出现以上问题,将加密时使用的JDK指定为启动JDK,具体如下:

C:/Users/Laptop/Desktop/test/Myproject/bin/xjar C:/ProgramFile/java/jdk_1.8_0.161/bin/java -jar ../boot/Test.jar --spring.config.location=../config/ --safetyuser.isEnableAnsi=false

加黑部分为JDK的安装目录。

你可能感兴趣的:(Java代码防止反编译)