jar加密方案

ClassFinal加密

简介:

基于字节码转换java版,对SpringBoot支持也好,其逻辑就是基于-agentJava:xxx.jar这一套原理,加密时对class文件做了两次处理,一次是对class文件的字节码完全加密,一次是对class文件混淆,这个混淆是保留成员和方法,对方法内部实现进行隐藏;解密时,判断如果该类是自己加密过的,找到完全加密的字节码进行解密,如果不是自己加密的就跳过。其对class文件混淆,就是方便类似SpringBoot等三方框架直接分析class文件。好处就是,如果你是个工具包,加密后给其它人,其他人编程时引用或者编译都不影响,但是运行时需要加密方支持,给出秘钥之类的。比较灵活和好用,也存在该方式的统一缺陷,不过其支持主程序jar加密,也支持单独的第三方工具jar加密。

功能介绍

  • 无需修改原项目代码,只要把编译好的jar/war包用本工具加密即可。
  • 运行加密项目时,无需求修改tomcat,spring等源代码。
  • 支持普通jar包、springboot jar包以及普通java web项目编译的war包。
  • 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。
  • 支持maven插件,添加插件后在打包过程中自动加密。
  • 支持加密WEB-INF/lib或BOOT-INF/lib下的依赖jar包。
  • 支持绑定机器,项目加密后只能在特定机器运行。
  • 支持加密springboot的配置文件。

加密

第一种 通用方式

执行以下命令

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。

第二种 maven插件方式

在要加密的项目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指定机器码。机器绑定可同时支持机器码+密码的方式加密。(推荐)

启动加密后的jar

加密后的项目需要设置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

tomcat下运行加密后的war

将加密后的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  环境变量中密码的名字

你可能感兴趣的:(技术学习笔记,jar,java,jar加密)