天天看点

java代码混淆工具ProGuard混淆插件

java代码混淆工具ProGuard混淆插件

介绍

ProGuard是一个纯java编写的混淆工具,有客户端跟jar包两种使用方式。可以将程序打包为jar,然后用工具进行混淆,也可以在maven中导入ProGuard的插件,对代码进行混淆。

大家都知道

java代码可以反编译,因此有时候要保护自己的知识产权还真得费点心思,一般来说有三个思路:

  • 1、将class文件加密,这个是最安全的,但也费事儿,因为要重写classloader来解密class文件;
  • 2、使用花指令,使得class文件不能反编译(利用反编译工具漏洞);安全性一般,还是有花指令破解器;
  • 3、代码混淆,提高代码阅读成本;简单易操作,一般采用这种或者与其它方式结合;

maven项目引入插件

pom.xml

<plugins>
<!-- ProGuard混淆插件-->
			<plugin>
				<groupId>com.github.wvengen</groupId>
				<artifactId>proguard-maven-plugin</artifactId>
				<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>
					<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>-keepdirectories</option>

						<!-- 需要保持的属性:异常,注解等-->
						<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
						<option>-keep class javax.annotation.**</option>
						<option>-dontwarn javax.crypto.**</option>
						<option>-keep class javax.crypto.**</option>
					</options>

					<outjar>${project.build.finalName}-pg.jar</outjar>
					<libs>
						<lib>${java.home}/lib/rt.jar</lib>
					</libs>
					<!-- 对什么东西进行加载,这里仅有classes成功,毕竟你也不可能对配置文件及JSP混淆吧-->
					<injar>classes</injar>
					<!-- 输出目录-->
					<outputDirectory>${project.build.directory}</outputDirectory>
				</configuration>
			</plugin>
</plugins>
           

打包生成混淆jar包

mvn clean install -Dmaven.test.skip=true
           
java代码混淆工具ProGuard混淆插件

部署