基于字节码转换java版,对SpringBoot支持也好,其逻辑就是基于-agentJava:xxx.jar这一套原理,加密时对class文件做了两次处理,一次是对class文件的字节码完全加密,一次是对class文件混淆,这个混淆是保留成员和方法,对方法内部实现进行隐藏;解密时,判断如果该类是自己加密过的,找到完全加密的字节码进行解密,如果不是自己加密的就跳过。其对class文件混淆,就是方便类似SpringBoot等三方框架直接分析class文件。好处就是,如果你是个工具包,加密后给其它人,其他人编程时引用或者编译都不影响,但是运行时需要加密方支持,给出秘钥之类的。比较灵活和好用,也存在该方式的统一缺陷,不过其支持主程序jar加密,也支持单独的第三方工具jar加密。
执行以下命令
java -javaagent:com.ccc.admin-V20200227_1-encrypted.jar='-pwd 123456' -jar com.ccc.admin-V20200227_1-encrypted.jar
或者
直接执行 java -jar classfinal-fatjar.jar 按照步骤提示输入信息完成加密。(推荐方法)
参数说明
-file 加密的jar/war完整路径
-packages 加密的包名(可为空,多个用","分割)
-libjars jar/war包lib下要加密jar文件名(可为空,多个用","分割)
-cfgfiles 需要加密的配置文件,一般是classes目录下的yml或properties文件(可为空,多个用","分割)
-exclude 排除的类名(可为空,多个用","分割)
-classpath 外部依赖的jar目录,例如/tomcat/lib(可为空,多个用","分割)
-pwd 加密密码,如果是#号,则使用无密码模式加密
-code 机器码,在绑定的机器生成,加密后只可在此机器上运行
-Y 无需确认,不加此参数会提示确认以上信息
结果: 生成 com.ccc.admin-V20200227_1-encrypted.jar,这个就是加密后的jar文件;加密后的文件不可直接执行,需要配置javaagent。
在要加密的项目pom.xml中加入以下插件配置,目前最新版本是:1.2.1。
<plugin>
<groupId>net.roseboygroupId>
<artifactId>classfinal-maven-pluginartifactId>
<version>${classfinal.version}version>
<configuration>
<password>000000password>
<packages>com.yourpackage,com.yourpackage2packages>
<cfgfiles>application.ymlcfgfiles>
<excludes>org.springexcludes>
<libjars>a.jar,b.jarlibjars>
configuration>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>classFinalgoal>
goals>
execution>
executions>
plugin>
运行mvn package时会在target下自动加密生成yourpaoject-encrypted.jar。
maven插件的参数名称与直接运行的参数相同,请参考上节的参数说明。
加密时-pwd参数设为#,启动时可不用输入密码; 如果是war包,启动时指定参数 -nopwd,跳过输密码过程。
机器绑定只允许加密的项目在特定的机器上运行;
在需要绑定的机器上执行以下命令,生成机器码
java -jar classfinal-fatjar.jar -C
加密时用-code指定机器码。机器绑定可同时支持机器码+密码的方式加密。(推荐)
加密后的项目需要设置javaagent来启动,项目在启动过程中解密class,完全内存解密,不留下任何解密后的文件。
解密功能已经自动加入到 yourpaoject-encrypted.jar中,所以启动时-javaagent与-jar相同,不需要额外的jar包。
启动jar项目执行以下命令:
第一种:不带参数
java -javaagent:com.ccc.admin-V20200227_1-encrypted.jar -jar com.ccc.admin-V20200227_1-encrypted.jar
第二种:带参数
java -javaagent:com.ccc.admin-V20200227_1-encrypted.jar='-pwd 123456' -jarcom.ccc.admin-V20200227_1-encrypted.jar
将加密后的war放在tomcat/webapps下, tomcat/bin/catalina 增加以下配置:
//linux下 catalina.sh
CATALINA_OPTS="$CATALINA_OPTS -javaagent:classfinal-fatjar.jar='-pwd 0000000'";
export CATALINA_OPTS;
//win下catalina.bat
set JAVA_OPTS="-javaagent:classfinal-fatjar.jar='-pwd 000000'"
//参数说明
// -pwd 加密项目的密码
// -nopwd 无密码加密时启动加上此参数,跳过输密码过程
// -pwdname 环境变量中密码的名字