赞
踩
java代码防反编译处理
<build> <!-- 编译后的jar名称 可自定义 --> <finalName>test-1.2.0-SNAPSHOT</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- 代码混淆插件 --> <plugin> <dependencies> <dependency> <groupId>net.sf.proguard</groupId> <artifactId>proguard-base</artifactId> <!-- 2019年7月15日 jdk1.8 兼容性还可以 --> <version>6.0.2</version> <scope>runtime</scope> </dependency> </dependencies> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <!-- 2019年7月15日 jdk1.8 兼容性还可以 --> <version>2.0.14</version> <executions> <execution> <!-- 混淆时刻,这里是打包的时候混淆 --> <phase>package</phase> <goals> <!-- 使用插件的什么功能,当然是混淆 --> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <!-- 是否将生成的PG文件安装部署 --> <attach>true</attach> <!-- 是否混淆 --> <obfuscate>true</obfuscate> <!-- 指定生成文件分类 --> <attachArtifactClassifier>pg</attachArtifactClassifier> <!-- ProGuard配置参数(可引用cfg配置文件) --> <options> <!-- JDK目标版本1.8--> <option>-target 1.8</option> <!-- 不做收缩(删除注释、未被引用代码) --> <option>-dontshrink</option> <!-- 不做优化(变更代码实现逻辑) --> <option>-dontoptimize</option> <!-- 不路过非公用类文件及成员 --> <option>-dontskipnonpubliclibraryclasses</option> <option>-dontskipnonpubliclibraryclassmembers</option> <!--不用大小写混合类名机制--> <option>-dontusemixedcaseclassnames</option> <!-- 优化时允许访问并修改有修饰符的类和类的成员 --> <option>-allowaccessmodification</option> <!-- 确定统一的混淆类的成员名称来增加混淆 --> <option>-useuniqueclassmembernames</option> <!-- 不混淆所有包名,整体混淆会出现各种各样的问题 程序又不会把你该引用的地方引用好 会直接修改类名 参数名的 建议不去除 有这个标签的话 <option>-keep class !com.package.** { *; }</option> 加入这个标签的报包名程序才会修改 --> <option>-keeppackagenames</option> <option>-adaptclassstrings</option> <!-- <option>-keepdirectories</option> --> <!-- 不混淆所有特殊的类 --> <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option> <!-- This option will save all original methods parameters in files defined in -keep sections, otherwise all parameter names will be obfuscate. --> <option>-keepparameternames</option> <option>-keepclassmembers class * { @org.springframework.beans.factory.annotation.Autowired *; @org.springframework.beans.factory.annotation.Value *; } </option> <!-- 混淆这个包下的类 此处需要更改为自己需要混淆的包名--> <option>-keep class !com.package.service.** { *; }</option> <!-- 不混淆main方法 此处需要更改为自己的启动类路径 --> <option>-keep class com.package.Application { *; }</option> <!-- 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射 --> <option>-keepclassmembers public class * {void set*(***);*** get*();}</option> <!-- 不混淆包中的所有类以及类的属性及方法,实体包,混淆了会导致ORM框架及前端无法识别 --> <!-- 不对包类的类名进行混淆,但对类中的属性和方法混淆 --> <!--<option>-keep class com.package.util.** </option>--> <!-- <option>-keep class com.example.service.** </option>--> <option>-dontwarn **</option> </options> <!--class 混淆后输出的jar包 --> <outjar>${project.build.finalName}-pg.jar</outjar> <!-- 混淆时需要引用的java库,这些库的类不会做混淆 --> <libs> <lib>${java.home}/lib/rt.jar</lib> <lib>${java.home}/lib/jce.jar</lib> </libs> <!-- 需要做混淆的jar或目录 --> <injar>classes</injar> <!-- 输出目录 --> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </plugin> </plugins> </build>
基于项目结构比较复杂,采用加密处理。
加密采用的是ClassFinal进行,ClassFinal是一款开源java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,
直接使用:在pom文件中添加如下插件
<!-- 项目加密--> <plugin> <groupId>net.roseboy</groupId> <artifactId>classfinal-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <password>000000</password><!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码--> <packages>com.xxx.*</packages> <cfgfiles></cfgfiles> <excludes></excludes> <libjars></libjars> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>classFinal</goal> </goals> </execution> </executions> </plugin>
maven操作:mvn clean package获取加密包
直接启动:
java -javaagent:yourpaoject-encrypted.jar=’-pwd 0000000’ -jar yourpaoject-encrypted.jar
反编译加密后的包会将配置中方法细节隐藏掉,防止偷看。
更多参数配置查看官网说明:https://gitee.com/roseboy/classfinal
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。