为了防止通过反编译获取源码,可以使用代码混淆来提高代码阅读的成本。
本文使用ProGuard进行混淆,Maven打包时混淆使用的插件:https://github.com/wvengen/proguard-maven-plugin
具体实现
1.在pom plugins中添加混淆插件
<!-- ProGuard混淆插件 --> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.2.0</version> <executions> <execution> <!-- 混淆时刻,这里是打包的时候混淆 --> <phase>package</phase> <goals> <!-- 使用插件的什么功能,当然是混淆 --> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <!-- 是否将生成的PG文件安装部署 --> <attach>true</attach> <!-- 是否混淆 --> <obfuscate>true</obfuscate> <!-- 指定生成文件分类 --> <attachArtifactClassifier>pg</attachArtifactClassifier> <!-- 混淆配置文件 --> <proguardInclude>${basedir}/proguard.cfg</proguardInclude> <injarNotExistsSkip>true</injarNotExistsSkip> <!-- 要混淆的jar --> <injar>${project.build.finalName}.jar</injar> <!--混淆后输出的jar包,会默认生成为*-pg.jar --> <outjar>${project.build.finalName}.jar</outjar> <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 --> <libs> <lib>${java.home}/lib/rt.jar</lib> </libs> <!-- 输出目录 --> <outputDirectory>${project.build.directory}/</outputDirectory> </configuration> </plugin>
2.整理proguard.cfg配置文件
<!-- 下面代码是通过直接配置plugin configuration的options配置,本文中是通过配置文件加载这些配置,这里粘出来是为了让大家了解注释及规则--> <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>-keeppackagenames</option>--> <!-- 需要保持的属性:异常,注解等--> <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option> <!-- 不混淆所有的set/get方法-> <!--<option>-keepclassmembers public class * {void set*(***);*** get*();}</option>--> <!-- 不混淆包下的所有类名,且类中的方法也不混淆--> <option>-keep class com.xxx.xxx.bboss.SystemConfig { <methods>; }</option> <option>-keep class com.xxx.xxx.framework.** { *; }</option> <option>-keep class com.xxx.xxx.xxx.controller.** { <methods>; }</option> <option>-keep class com.xxx.xxx.xxx.dao.** { <methods>; }</option> <option>-keep class com.xxx.xxx.xxx.exception { <methods>; }</option> <option>-keep class com.xxx.xxx.xxx.model.** { <methods>; }</option> </options> 作者:ming_Liu 链接:https://www.jianshu.com/p/f9132d3d1a47 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
proguard.cfg(配置文件放在和pom.xml同级即可)
-target 1.8 -dontshrink -dontoptimize -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -dontusemixedcaseclassnames -allowaccessmodification -useuniqueclassmembernames -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod -keepclassmembers public class * {void set*(***);*** get*();} -keep class com.shouxun.contract.config.Start {*;} -keepclassmembers class com.shouxun.contract.controller.* { <methods>; } -keep class com.jfinal.** { *; } -dontwarn org.apache.** -dontwarn com.aliyun.** -dontwarn com.dingtalk.** -dontwarn com.taobao.** -dontwarn com.jfinal.**
配置中有几个地方需要注意
1.-keep class com.shouxun.contract.config.Start {*;} //不混淆入口启动项 2.-keepclassmembers public class * {void set*(***);*** get*();} //不混淆getter,setter方法 3.-keepclassmembers class com.shouxun.contract.controller.* { <methods>; } //不混淆控制层所有的方法名,如果混淆后action会导致404 4.其他需要排除的jar包和不需要的jar自己按需更改
3.修改package.xml(把放到lib下面的原始jar排除,混淆后的jar包放入打包的lib目录)
//在package.xml中把maven依赖到的jar复制到lib下,并排除原始jar
//在package.xml中fileSets中添加把混淆后的jar复制到lib
然后进行maven打包,打包成功后在项目target目录下会有一个*-pg.jar的混淆后的jar包,用反编译工具打开此jar包
问题
混淆后日志报错无法直观定位问题位置
jfinal java8 Action参数注入无法注入,主要是此插件打包暂时还不知道怎么配置-parameters