当前位置:   article > 正文

SpringBoot如何防止反编译?proguard+xjar 完美搞定

springboot proguard

f2ea934d3993d6115019154155b79d60.jpeg

程序员的成长之路

互联网/程序员/技术/资料共享 

关注

阅读本文大概需要 16 分钟。

来自:blog.csdn.net/mawei7510/article/details/130828709

一、背景

项目组核心代码模块部署于用户服务器上,直接甩jar包到服务器的方式,极有可能导致数据泄露和代码泄露,为了防止有技术能力的用户反编译我们的程序,采用了proguard和xjar两种方式来混淆和加密jar包。

注:加密技术只是提高别人获取你的代码的门槛,没有绝对安全的加密方式,而安全等级越高,程序开发、运维、部署的成本就越高,所以,合适的加密技术就是最好的。

二、简介

1.ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。常常用于Android开发用于混淆最终的项目,增加项目被反编译的难度。

2.Xjar

  • Spring Boot JAR 安全加密运行工具, 同时支持的原生JAR

  • 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动, 动态解密运行的方案, 避免源码泄露以及反编译.

功能特性

  • 无代码侵入, 只需要把编译好的JAR包通过工具加密即可.

  • 完全内存解密, 降低源码以及字节码泄露或反编译的风险.

  • 支持所有JDK内置加解密算法.

  • 可选择需要加解密的字节码或其他资源文件.

  • 支持Maven插件, 加密更加便捷.

  • 动态生成Go启动器, 保护密码不泄露.

3.ClassFinal是一款Java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework,可避免源码泄漏或字节码被反编译,

功能特性

  • 无需修改原项目代码,只要把编译好的jar/war包用本工具加密即可。

  • 运行加密项目时,无需求修改tomcat,spring等源代码。

  • 支持普通jar包、springboot jar包以及普通java web项目编译的war包。

  • 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。

  • 支持maven插件,添加插件后在打包过程中自动加密。

  • 支持加密WEB-INF/lib或BOOT-INF/lib下的依赖jar包。

三、预研了classfinal

classfinal其实也可以起到代码加密的效果,功能也很强大,被classfinal加密过后的jar包,反编译了以后,方法返回值会return null或者0,方法内部会自动去掉。并且用classfinal加密过后的jar包启动方式需要用javaagnet启动。而相比较xjar,反编译以后,反编译后,直接显示Internal Error.

1.module pom文件引入

  1. <plugin>
  2.     <groupId>net.roseboy</groupId>
  3.     <artifactId>classfinal-maven-plugin</artifactId>
  4.     <version>1.2.1</version>
  5.     <configuration>
  6.         <password>#</password><!-- #表示启动时不需要密码,事实上对于代码混淆来说,这个密码没什么用,它只是一个启动密码 -->
  7.         <packages>com.nick.gnss</packages><!-- 加密的包名,多个包用逗号分开-->
  8.         <excludes>org.spring</excludes>
  9.     </configuration>
  10.     <executions>
  11.         <execution>
  12.             <phase>package</phase>
  13.             <goals>
  14.                 <goal>classFinal</goal>
  15.             </goals>
  16.         </execution>
  17.     </executions>
  18. </plugin>

2.启动方式

1)无密码启动

java -jar gnss-server-1.0.0-encrypted.jar

2)有密码启动

java -javaagent:gnss-server-1.0.0-encrypted.jar="-pwd 123456" -jar gnss-server-1.0.0-encrypted.jar

3.反编译后的效果

所有的方法,return 0 或者 null. 方法体内部是空的。

1368595066ccce878af6dcaf7be8486d.png

四、引入proguard混淆

1.module中增加proguard.cfg文件

  1. #指定Java的版本
  2. -target 1.8
  3. #proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
  4. -dontshrink
  5. #是否关闭字节码级别的优化,如果不开启则设置如下配置
  6. -dontoptimize
  7. #混淆时不生成大小写混合的类名,默认是可以大小写混合
  8. -dontusemixedcaseclassnames
  9. # 对于类成员的命名的混淆采取唯一策略
  10. -useuniqueclassmembernames
  11. #混淆时不生成大小写混合的类名,默认是可以大小写混合
  12. -dontusemixedcaseclassnames
  13. #混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
  14. -adaptclassstrings
  15.  
  16. #对异常、注解信息予以保留
  17. -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
  18. # 此选项将保存接口中的所有原始名称(不混淆)-->
  19. -keepnames interface ** { *; }
  20. # 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
  21. #-keep interface * extends * { *; }
  22. #保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
  23. -keepparameternames
  24. # 保留枚举成员及方法
  25. -keepclassmembers enum * { *; }
  26. # 不混淆所有的set/get方法
  27. -keepclassmembers public class * {void set*(***);*** get*();}
  28.  
  29. # 不混淆所有包含Component等注解的类
  30. -keep @org.springframework.context.annotation.Bean class * {*;}
  31. -keep @org.springframework.context.beans.factory.annotation.Autowired class * {*;}
  32. -keep @org.springframework.context.beans.factory.annotation.Value class * {*;}
  33. -keep @org.springframework.stereotype.Service class * {*;}
  34. -keep @org.springframework.stereotype.Component class * {*;}
  35. -keep @org.springframework.web.bind.annotation.RestController class * {*;}
  36. -keep @org.springframework.context.annotation.Configuration class * {*;}
  37.  
  38. #忽略warn消息
  39. -ignorewarnings
  40. #忽略note消息
  41. -dontnote
  42. #打印配置信息
  43. -printconfiguration
  44. #启动类不需要混淆
  45. -keep class com.nick.GnssApplication {
  46.     public static void main(java.lang.String[]);
  47. }

2.module pom文件引入

此处需要注意,proguard plugin需要放在repackage plugin之前,否则混淆没有效果。原理就是在打包之前将代码混淆,然后再打包。

  1. <!--代码混淆proguard-->
  2. <plugin>
  3.     <groupId>com.github.wvengen</groupId>
  4.     <artifactId>proguard-maven-plugin</artifactId>
  5.     <version>2.6.0</version>
  6.     <executions>
  7.         <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
  8.         <execution>
  9.             <phase>package</phase>
  10.             <goals>
  11.                 <goal>proguard</goal>
  12.             </goals>
  13.         </execution>
  14.     </executions>
  15.     <configuration>
  16.         <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
  17.         <injar>${project.build.finalName}.jar</injar>
  18.         <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
  19.         <outjar>${project.build.finalName}.jar</outjar>
  20.         <!-- 是否混淆 默认是true -->
  21.         <obfuscate>true</obfuscate>
  22.         <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
  23.         <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
  24.         <!-- 额外的jar包,通常是项目编译所需要的jar -->
  25.         <libs>
  26.             <lib>${java.home}/lib/rt.jar</lib>
  27.             <lib>${java.home}/lib/jce.jar</lib>
  28.             <lib>${java.home}/lib/jsse.jar</lib>
  29.         </libs>
  30.         <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
  31.         <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
  32.         <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
  33.         <outputDirectory>${project.basedir}/target</outputDirectory>
  34.         <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
  35.         <options>
  36.             <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
  37.         </options>
  38.     </configuration>
  39. </plugin>
  40. <plugin>
  41.     <groupId>org.springframework.boot</groupId>
  42.     <artifactId>spring-boot-maven-plugin</artifactId>
  43.     <version>2.3.7.RELEASE</version>
  44.     <configuration>
  45.         <mainClass>com.nick.GnssApplication</mainClass>
  46.     </configuration>
  47.     <executions>
  48.         <execution>
  49.             <id>repackage</id>
  50.             <goals>
  51.                 <goal>repackage</goal>
  52.             </goals>
  53.         </execution>
  54.     </executions>
  55. </plugin>

3.反编译看效果

查看xxx.jar是否有混淆的效果,而不是xxx_proguard_base.jar(此jar是没有混淆的原jar)

2124c7189e2121372c1fde3c3a86e964.png

效果杠杠滴!!!需要试运行,并且注意配置proguard,否则会导致程序运行异常,这可能就是proguard的唯一缺点了吧,欢迎拍砖。。。

0466899e059f99aaaeb3448d2c2ca3b0.png

4.运行查看效果

启动成功,没毛病

231f1e0acbea5b2a81c899c8cbb1e93b.png

五、引入xjar

1.parent pom文件引入

重点在最下面的xjar plugin

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <groupId>com.nick</groupId>
  6.     <artifactId>nick-server</artifactId>
  7.     <version>1.0.0</version>
  8.     <name>nick-server</name>
  9.     <description>Demo project for Spring Boot</description>
  10.  
  11.     <properties>
  12.         <java.version>1.8</java.version>
  13.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  15.         <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  16.     </properties>
  17.  
  18.     <modules>
  19.         <module>gnss-server</module>
  20.     </modules>
  21.  
  22.     <packaging>pom</packaging>
  23.  
  24.     <dependencies>
  25.         <dependency>
  26.             <groupId>org.springframework.boot</groupId>
  27.             <artifactId>spring-boot-starter</artifactId>
  28.         </dependency>
  29.  
  30.         <dependency>
  31.             <groupId>org.springframework.boot</groupId>
  32.             <artifactId>spring-boot-starter-test</artifactId>
  33.             <scope>test</scope>
  34.             <exclusions>
  35.                 <exclusion>
  36.                     <groupId>org.junit.vintage</groupId>
  37.                     <artifactId>junit-vintage-engine</artifactId>
  38.                 </exclusion>
  39.             </exclusions>
  40.         </dependency>
  41.     </dependencies>
  42.  
  43.     <dependencyManagement>
  44.         <dependencies>
  45.             <dependency>
  46.                 <groupId>org.springframework.boot</groupId>
  47.                 <artifactId>spring-boot-dependencies</artifactId>
  48.                 <version>${spring-boot.version}</version>
  49.                 <type>pom</type>
  50.                 <scope>import</scope>
  51.             </dependency>
  52.         </dependencies>
  53.     </dependencyManagement>
  54.  
  55.     <build>
  56.         <plugins>
  57.             <plugin>
  58.                 <groupId>org.apache.maven.plugins</groupId>
  59.                 <artifactId>maven-compiler-plugin</artifactId>
  60.                 <version>3.8.1</version>
  61.                 <configuration>
  62.                     <source>1.8</source>
  63.                     <target>1.8</target>
  64.                     <encoding>UTF-8</encoding>
  65.                 </configuration>
  66.             </plugin>
  67.  
  68.             <!--代码加密-->
  69.             <plugin>
  70.                 <groupId>com.github.core-lib</groupId>
  71.                 <artifactId>xjar-maven-plugin</artifactId>
  72.                 <version>v2.0.7</version>
  73.                 <executions>
  74.                     <execution>
  75.                         <goals>
  76.                             <goal>build</goal>
  77.                         </goals>
  78.                         <phase>package</phase>
  79.                         <configuration>
  80.                             <password>44889951235894612351265ABD123</password>
  81.                             <mode>1</mode>
  82.                             <sourceDir>${project.build.directory}</sourceDir>
  83.                             <targetJar>${project.build.finalName}_x.jar</targetJar>
  84.                             <includes>
  85.                                 <include>com/nick/**</include>
  86.                             </includes>
  87.                         </configuration>
  88.                     </execution>
  89.                 </executions>
  90.             </plugin>
  91.  
  92.         </plugins>
  93.     </build>
  94.  
  95. </project>

2. module pom文件引入

需要放在module pom文件plugin 最后一个,保证xjar是最后一个执行plugin

  1. <!--代码加密xjar-->
  2. <plugin>
  3.     <groupId>com.github.core-lib</groupId>
  4.     <artifactId>xjar-maven-plugin</artifactId>
  5. </plugin>

3.编译打包

682eecbcc7879d4be6bcc82d11b19a89.png

4.反编译看效果

效果杠杠滴

7c04b435ca82e13aee9eb26897cf8eb2.png

5.运行查看效果

1818b37d6962a2d6cfc3d2d09b000b5b.png

六、proguard + xjar

将第四步和第五步融合即可,但是要注意pom文件中的plugin的先后问题,不然要么混淆失败,要么加密失败。

1.完整版的parent pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <groupId>com.nick</groupId>
  6.     <artifactId>nick-server</artifactId>
  7.     <version>1.0.0</version>
  8.     <name>nick-server</name>
  9.     <description>Demo project for Spring Boot</description>
  10.  
  11.     <properties>
  12.         <java.version>1.8</java.version>
  13.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  15.         <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  16.     </properties>
  17.  
  18.     <modules>
  19.         <module>gnss-server</module>
  20.     </modules>
  21.  
  22.     <packaging>pom</packaging>
  23.  
  24.     <dependencies>
  25.         <dependency>
  26.             <groupId>org.springframework.boot</groupId>
  27.             <artifactId>spring-boot-starter</artifactId>
  28.         </dependency>
  29.  
  30.         <dependency>
  31.             <groupId>org.springframework.boot</groupId>
  32.             <artifactId>spring-boot-starter-test</artifactId>
  33.             <scope>test</scope>
  34.             <exclusions>
  35.                 <exclusion>
  36.                     <groupId>org.junit.vintage</groupId>
  37.                     <artifactId>junit-vintage-engine</artifactId>
  38.                 </exclusion>
  39.             </exclusions>
  40.         </dependency>
  41.     </dependencies>
  42.  
  43.     <dependencyManagement>
  44.         <dependencies>
  45.             <dependency>
  46.                 <groupId>org.springframework.boot</groupId>
  47.                 <artifactId>spring-boot-dependencies</artifactId>
  48.                 <version>${spring-boot.version}</version>
  49.                 <type>pom</type>
  50.                 <scope>import</scope>
  51.             </dependency>
  52.         </dependencies>
  53.     </dependencyManagement>
  54.  
  55.     <build>
  56.         <plugins>
  57.             <plugin>
  58.                 <groupId>org.apache.maven.plugins</groupId>
  59.                 <artifactId>maven-compiler-plugin</artifactId>
  60.                 <version>3.8.1</version>
  61.                 <configuration>
  62.                     <source>1.8</source>
  63.                     <target>1.8</target>
  64.                     <encoding>UTF-8</encoding>
  65.                 </configuration>
  66.             </plugin>
  67.  
  68.             <!--代码加密-->
  69.             <plugin>
  70.                 <groupId>com.github.core-lib</groupId>
  71.                 <artifactId>xjar-maven-plugin</artifactId>
  72.                 <version>v2.0.7</version>
  73.                 <executions>
  74.                     <execution>
  75.                         <goals>
  76.                             <goal>build</goal>
  77.                         </goals>
  78.                         <phase>package</phase>
  79.                         <configuration>
  80.                             <password>44889951235894612351265ABD123</password>
  81.                             <mode>1</mode>
  82.                             <sourceDir>${project.build.directory}</sourceDir>
  83.                             <targetJar>${project.build.finalName}_x.jar</targetJar>
  84.                             <includes>
  85.                                 <include>com/nick/**</include>
  86.                             </includes>
  87.                         </configuration>
  88.                     </execution>
  89.                 </executions>
  90.             </plugin>
  91.  
  92.         </plugins>
  93.     </build>
  94.  
  95. </project>

2.完整版的poguard.cfg

  1. #指定Java的版本
  2. -target 1.8
  3. #proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
  4. -dontshrink
  5. #是否关闭字节码级别的优化,如果不开启则设置如下配置
  6. -dontoptimize
  7. #混淆时不生成大小写混合的类名,默认是可以大小写混合
  8. -dontusemixedcaseclassnames
  9. # 对于类成员的命名的混淆采取唯一策略
  10. -useuniqueclassmembernames
  11. #混淆时不生成大小写混合的类名,默认是可以大小写混合
  12. -dontusemixedcaseclassnames
  13. #混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
  14. -adaptclassstrings
  15.  
  16. #对异常、注解信息予以保留
  17. -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
  18. # 此选项将保存接口中的所有原始名称(不混淆)-->
  19. -keepnames interface ** { *; }
  20. # 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
  21. #-keep interface * extends * { *; }
  22. #保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
  23. -keepparameternames
  24. # 保留枚举成员及方法
  25. -keepclassmembers enum * { *; }
  26. # 不混淆所有的set/get方法
  27. -keepclassmembers public class * {void set*(***);*** get*();}
  28.  
  29. # 不混淆所有包含Component等注解的类
  30. -keep @org.springframework.context.annotation.Bean class * {*;}
  31. -keep @org.springframework.context.beans.factory.annotation.Autowired class * {*;}
  32. -keep @org.springframework.context.beans.factory.annotation.Value class * {*;}
  33. -keep @org.springframework.stereotype.Service class * {*;}
  34. -keep @org.springframework.stereotype.Component class * {*;}
  35. -keep @org.springframework.web.bind.annotation.RestController class * {*;}
  36. -keep @org.springframework.context.annotation.Configuration class * {*;}
  37.  
  38. #忽略warn消息
  39. -ignorewarnings
  40. #忽略note消息
  41. -dontnote
  42. #打印配置信息
  43. -printconfiguration
  44. #启动类不需要混淆
  45. -keep class com.nick.GnssApplication {
  46.     public static void main(java.lang.String[]);
  47. }

3.完整版的module pom文件

该pom文件中注意两点 1)引入parent节点  2)需要放在最后一个plugin执行

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.  
  5.     <parent>
  6.         <artifactId>nick-server</artifactId>
  7.         <groupId>com.nick</groupId>
  8.         <version>1.0.0</version>
  9.     </parent>
  10.  
  11.     <modelVersion>4.0.0</modelVersion>
  12.     <groupId>com.nick</groupId>
  13.     <artifactId>gnss-server</artifactId>
  14.     <version>1.0.0</version>
  15.     <name>gnss-server</name>
  16.     <description>gnss-server</description>
  17.  
  18.  
  19.     <properties>
  20.         <java.version>1.8</java.version>
  21.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  23.         <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  24.         <!--maven.build.timestamp保存了maven编译时间戳-->
  25.         <!--在Maven 3.2.2+中, maven.build.timestamp已被重新定义,显示UTC中的时间,比中国时间慢8个小时-->
  26.         <timestamp>${maven.build.timestamp}</timestamp>
  27.         <!--指定时间格式-->
  28.         <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
  29.     </properties>
  30.  
  31.     <dependencies>
  32.         <dependency>
  33.             <groupId>org.springframework.boot</groupId>
  34.             <artifactId>spring-boot-starter</artifactId>
  35.         </dependency>
  36.  
  37.         <dependency>
  38.             <groupId>org.springframework.boot</groupId>
  39.             <artifactId>spring-boot-starter-test</artifactId>
  40.             <scope>test</scope>
  41.             <exclusions>
  42.                 <exclusion>
  43.                     <groupId>org.junit.vintage</groupId>
  44.                     <artifactId>junit-vintage-engine</artifactId>
  45.                 </exclusion>
  46.             </exclusions>
  47.         </dependency>
  48.  
  49.         <dependency>
  50.             <groupId>io.jsonwebtoken</groupId>
  51.             <artifactId>jjwt</artifactId>
  52.             <version>0.9.1</version>
  53.         </dependency>
  54.  
  55.         <!-- lombok -->
  56.         <dependency>
  57.             <groupId>org.projectlombok</groupId>
  58.             <artifactId>lombok</artifactId>
  59.             <version>1.18.16</version>
  60.         </dependency>
  61.  
  62.         <dependency>
  63.             <groupId>commons-io</groupId>
  64.             <artifactId>commons-io</artifactId>
  65.             <version>2.6</version>
  66.         </dependency>
  67.  
  68.         <dependency>
  69.             <groupId>com.alibaba</groupId>
  70.             <artifactId>fastjson</artifactId>
  71.             <!--1.2.80以下存在安全漏洞-->
  72.             <!--<version>1.2.78</version>-->
  73.             <version>1.2.83</version>
  74.         </dependency>
  75.  
  76.         <dependency>
  77.             <groupId>com.google.guava</groupId>
  78.             <artifactId>guava</artifactId>
  79.             <version>30.1.1-jre</version>
  80.         </dependency>
  81.  
  82.         <!--nacos-web-->
  83.         <dependency>
  84.             <groupId>org.springframework.boot</groupId>
  85.             <artifactId>spring-boot-starter-web</artifactId>
  86.         </dependency>
  87.     </dependencies>
  88.  
  89.     <dependencyManagement>
  90.         <dependencies>
  91.             <dependency>
  92.                 <groupId>org.springframework.boot</groupId>
  93.                 <artifactId>spring-boot-dependencies</artifactId>
  94.                 <version>${spring-boot.version}</version>
  95.                 <type>pom</type>
  96.                 <scope>import</scope>
  97.             </dependency>
  98.         </dependencies>
  99.     </dependencyManagement>
  100.  
  101.     <build>
  102.         <plugins>
  103.             <plugin>
  104.                 <groupId>org.apache.maven.plugins</groupId>
  105.                 <artifactId>maven-compiler-plugin</artifactId>
  106.                 <version>3.8.1</version>
  107.                 <configuration>
  108.                     <source>1.8</source>
  109.                     <target>1.8</target>
  110.                     <encoding>UTF-8</encoding>
  111.                 </configuration>
  112.             </plugin>
  113.             <plugin>
  114.                 <groupId>org.apache.maven.plugins</groupId>
  115.                 <artifactId>maven-resources-plugin</artifactId>
  116.                 <configuration>
  117.                     <delimiters>
  118.                         <delimiter>@</delimiter>
  119.                     </delimiters>
  120.                     <useDefaultDelimiters>false</useDefaultDelimiters>
  121.                 </configuration>
  122.             </plugin>
  123.  
  124.             <!--代码混淆proguard-->
  125.             <plugin>
  126.                 <groupId>com.github.wvengen</groupId>
  127.                 <artifactId>proguard-maven-plugin</artifactId>
  128.                 <version>2.6.0</version>
  129.                 <executions>
  130.                     <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
  131.                     <execution>
  132.                         <phase>package</phase>
  133.                         <goals>
  134.                             <goal>proguard</goal>
  135.                         </goals>
  136.                     </execution>
  137.                 </executions>
  138.                 <configuration>
  139.                     <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
  140.                     <injar>${project.build.finalName}.jar</injar>
  141.                     <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
  142.                     <outjar>${project.build.finalName}.jar</outjar>
  143.                     <!-- 是否混淆 默认是true -->
  144.                     <obfuscate>true</obfuscate>
  145.                     <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
  146.                     <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
  147.                     <!-- 额外的jar包,通常是项目编译所需要的jar -->
  148.                     <libs>
  149.                         <lib>${java.home}/lib/rt.jar</lib>
  150.                         <lib>${java.home}/lib/jce.jar</lib>
  151.                         <lib>${java.home}/lib/jsse.jar</lib>
  152.                     </libs>
  153.                     <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
  154.                     <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
  155.                     <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
  156.                     <outputDirectory>${project.basedir}/target</outputDirectory>
  157.                     <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
  158.                     <options>
  159.                         <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
  160.                     </options>
  161.                 </configuration>
  162.             </plugin>
  163.  
  164.             <plugin>
  165.                 <groupId>org.springframework.boot</groupId>
  166.                 <artifactId>spring-boot-maven-plugin</artifactId>
  167.                 <version>2.3.7.RELEASE</version>
  168.                 <configuration>
  169.                     <mainClass>com.nick.GnssApplication</mainClass>
  170.                 </configuration>
  171.                 <executions>
  172.                     <execution>
  173.                         <id>repackage</id>
  174.                         <goals>
  175.                             <goal>repackage</goal>
  176.                         </goals>
  177.                     </execution>
  178.                 </executions>
  179.             </plugin>
  180.  
  181.             <!--代码加密xjar-->
  182.             <plugin>
  183.                 <groupId>com.github.core-lib</groupId>
  184.                 <artifactId>xjar-maven-plugin</artifactId>
  185.             </plugin>
  186.  
  187.             <!--classfinal加密程序-->
  188.             <!--<plugin>-->
  189.             <!--<groupId>net.roseboy</groupId>-->
  190.             <!--<artifactId>classfinal-maven-plugin</artifactId>-->
  191.             <!--<version>1.2.1</version>-->
  192.             <!--<configuration>-->
  193.             <!--<password>#</password>&lt;!&ndash; #表示启动时不需要密码,事实上对于代码混淆来说,这个密码没什么用,它只是一个启动密码 &ndash;&gt;-->
  194.             <!--<packages>com.nick.gnss</packages>&lt;!&ndash; 加密的包名,多个包用逗号分开&ndash;&gt;-->
  195.             <!--<excludes>org.spring</excludes>-->
  196.             <!--</configuration>-->
  197.             <!--<executions>-->
  198.             <!--<execution>-->
  199.             <!--<phase>package</phase>-->
  200.             <!--<goals>-->
  201.             <!--<goal>classFinal</goal>-->
  202.             <!--</goals>-->
  203.             <!--</execution>-->
  204.             <!--</executions>-->
  205.             <!--</plugin>-->
  206.         </plugins>
  207.  
  208.         <resources>
  209.             <resource>
  210.                 <directory>src/main/resources</directory>
  211.                 <filtering>true</filtering>
  212.             </resource>
  213.         </resources>
  214.     </build>
  215.  
  216. </project>

4.打包编译

c02c7a7cf3f5310c42f031c3a00ccab3.png

5.反编译查看效果

e159d57a6ca79bb1145f9226921b8061.png

OK, 效果杠杠滴,混淆+加密。

至此,混淆+加密搞定。

花了蛮多时间测试验证,兄弟们觉得疗效好,望不吝点赞啊,也欢迎各种拍砖,哈哈~~~~

<END>

推荐阅读:

在华为,请假一天的代价是3700…

Java的ConcurrentHashMap是使用的分段锁?

  1. 互联网初中高级大厂面试题(9个G)
  2. 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
  3. ⬇戳阅读原文领取!                                  朕已阅
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/782663
推荐阅读
相关标签
  

闽ICP备14008679号