Skip to content

Jar 加密部署

在第三方服务器部署程序,防止程序被窃取,反编译做的jar绑定机器码、jar包加密、代码混淆、时间授权限制

机器码

机器码工具 下载

机器码生成

  • 下载jar包到并拷贝到服务器
  • 同级目录打开cmd
  • 执行
bash
java -jar classfinal-fatjar-1.2.1.jar -C

机器码生成

  • classfinal-code.txt 文件内即机器码

jar包加密、绑定机器码

启动项 pom.xml配置

xml
<build>
  <plugins>
      <plugin>
          <!--
              1. 加密后,方法体被清空,保留方法参数、注解等信息.主要兼容swagger文档注解扫描
              2. 方法体被清空后,反编译只能看到方法名和注解,看不到方法体的具体内容
              3. 加密后的项目需要设置javaagent来启动,启动过程中解密class,完全内存解密,不留下任何解密后的文件
              4. 启动加密后的jar,生成xxx-encrypted.jar,这个就是加密后的jar文件,加密后不可直接执行
              5. 无密码启动方式,java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
              6. 有密码启动方式,java -javaagent:xxx-encrypted.jar='-pwd= 密码' -jar xxx-encrypted.jar
          -->
          <groupId>net.roseboy</groupId>
          <artifactId>classfinal-maven-plugin</artifactId>
          <version>1.2.1</version>
          <configuration>
              <!-- #表示启动时不需要密码,事实上对于代码混淆来说,这个密码没什么用,它只是一个启动密码 -->
              <password>#</password>
              <excludes>org.spring</excludes>
              <!-- 加密的包名,多个包用逗号分开,旧zonetop.gisboot,新的ztgis -->
              <packages>zonetop.gisboot,ztgis</packages>
              <!-- application.yml 作环境文件加载 加密的配置文件,多个包用逗号分开,文件会被清空 -->
              <cfgfiles>application.yml,application-dev.yml,...</cfgfiles>
              <!-- jar包lib下面要加密的jar依赖文件,多个包用逗号分开,框架、业务的需要添加,方法体会被清空 -->
              <libjars>gis-boot-base-1.0.0.jar,gis-boot-core-1.0.0.jar,.....</libjars> 
              <!-- 指定机器启动,机器码步骤生成的code,多个环境 建议存储到application-xxx.yml -->
              <code>xxxx</code>
          </configuration>
          <executions>
              <execution>
                  <phase>package</phase>
                  <goals>
                      <goal>classFinal</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
  </plugins>
</build>
  • libjars 内配置的jar,方法体为空,sql不加密

启动项 application配置

classFinal 加密环境文件,也不允许 application环境配置文件 直接存储在服务器上

需通过application.yml切换打包的环境文件

yml
spring:
  #环境 dev|test|pro|preview,可自定义后缀
  profiles:
    active: house

yml环境文件

打包结果

打包结果

部署,环境文件配置

启用classFinal cfgfiles 会加密环境文件

基于生产环境与测试环境的配置差异,生产环境文件的配置操作如下:

  • 使用原包先部署配置
  • 生产环境调试好application-xxx.yml后拷贝回项目
  • 再重新打包并使用加密的包部署

项目启动

2个包启动有差异,需要修改winsw.xml文件

原包winsw.xml文件

xml
<service>
  <!--启动参数-->
  <arguments>-Dfile.encoding=utf-8 -jar api.jar --server.port=端口号</arguments>
</service>

加密winsw.xml文件

xml
<service>
  <!--使用加密,启动参数-->
  <arguments> -Dfile.encoding=utf-8 -javaagent:api.jar -jar api.jar --server.port=端口号</arguments>
</service>

效果

  • 机器码不正确

机器码不一致

  • 未配置: -javaagent:xxx.jar

未配置javaagent

代码混淆

暂无

计划使用:proguard-maven-plugin

Spring Boot 代码混淆

时间限制

有效期:敏感,查看代码规则生成

在程序启动时、接口调用时,做时间授权校验,过期,程序将停止运行

gis-boot

yml
gis-boot:
  expiration: 加密后的时间

ztgis-boot

yml
ztgis:
  expiration: 加密后的时间

执行效果:

Jar过期