ProGuard基于jdk1.8加SpringBoot加Maven加Mybatis的代码混淆

近日我新开发的一个项目结束了,但是我们项目需要用作商用,需要考虑到项目的可控性,可控性就是我们和第三方公司签约了合同,假如三年的合同,三年到期后他就无法正常使用我们的项目,需要和我们续约才能使用。

对接的第三方公司需要本地化部署,所以对于项目可控性,我从两方面下手,第一是做项目使用可控性。我是做了和pageOffice类似差不多的,给了一个授权码文件,license.key。  项目jar包部署到他们服务器,然后把license.key放到他们服务器指定位置。然后他们请求我写的服务,每次都会校验这个授权书在不在,里面的授权码正不正确,是否在有效期内。如果不在就无法请求。这个具体的代码下期再做更新。今天的主题是ProGuard。

这里ProGuard代码混淆有两种方式,第一种是可视化操作界面,第二种是在pom.xml里面配置。  我用的是第二种 在pom.xml配置方式。

其实操作步骤非常简单,但是刚接触到这个的时候是一头雾水。核心的配置其实就是插件。在插件里配置自己项目需要混淆的地方,不需要混淆的地方。然后所有的注释都写在了pom.xml里了大家有不懂的可以留言。

<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>
					<proguardVersion>6.0.2</proguardVersion>
					<obfuscate>true</obfuscate>
					<!--是否将生成的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>-allowaccessmodification</option>
						<!--确定统一的混淆类的成员名称来增加混淆,防止冲突-->
						<option>-useuniqueclassmembernames</option>
						<!--不混淆所有包名,Spring配置中有大量固定写法的包名-->
						<option>-keeppackagenames</option>
						<!--不混淆所有特殊的类-->
						<option>
							-keepattributes
							Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
						</option>
						<!--不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射-->
						<option>-keepclassmembers public class *{void set*(***);*** get*();}
						</option>
						<option>-keep interface * extends * { *; }</option>
						<!--保持你的加载主类不被混淆-->
						<option>-keep
							class com.Application {
							public static void main(java.lang.String[]);
							}
						</option>
						<!--保持你的被注入的类不被混淆-->
						<option>-keepclassmembers class * {
							@org.springframework.beans.factory.annotation.Autowired *;
							@org.springframework.beans.factory.annotation.Value *;
							}
						</option>
						<!--不显示警告信息,如果显示则会出现Error无法完成混淆!-->
						<option>-dontwarn **</option>
					</options>
					<!--编译过后被混淆的jar包-->
					<outjar>${project.build.finalName}-BelenChan.jar</outjar>

					<!--添加依赖,这里你可以按你的需要修改,每个jar包地址一定要对应  不燃build不成功-->
					<libs>
						<lib>${java.home}/lib/rt.jar</lib>
						<lib>${java.home}/lib/jce.jar</lib>
						<lib>${java.home}/lib/security/policy/unlimited/local_policy.jar</lib>
						<lib>${java.home}/lib/security/policy/unlimited/US_export_policy.jar</lib>
						<lib>${java.home}/lib/ext/sunjce_provider.jar</lib>
					</libs>

					<!--加载文件的过滤器,配置上你自己的工程目录,配置了什么目录,编译出来的jar只有你在这配置的包,其他没配置的没有编译-->

					<!--<inFilter>com/belenchan/**</inFilter>-->

					<!--对什么东西进行加载,这里仅有classes成功,毕竟你也不可能对配置文件及JSP混淆吧-->

					<injar>classes</injar>

					<!--输出目录-->

					<outputDirectory>${project.build.directory}</outputDirectory>
				</configuration>

				<dependencies>
					<!--使用6.0.2版本来混淆-->
					<dependency>
						<groupId>net.sf.proguard</groupId>
						<artifactId>proguard-base</artifactId>
						<version>6.0.2</version>
						<scope>runtime</scope>
					</dependency>

				</dependencies>

			</plugin>

然后在idea控制台输入mvn clean package 

最终编译后生成的jar如下

生成的jar在你输出的编译文件夹如下图

 

然后用反编译软件GUI 反编译出来的文件如下

如图,这就是混淆成功了,大家注意,最好包名不要混淆了,不然可能导致你有些获取文件的时候找不到文件,正常的controller地址也不用混淆。然后就是java -jar执行测试了。结束!感谢!

Spring Boot是一个开发框架,用于简化基于Java的应用程序的开发和部署。它提供了一个自动化配置的方式来简化开发过程,同时也提供了一些常用的功能模块,如安全、数据库连接等。 ProGuard是一个代码混淆工具,用于保护Java代码免受逆向工程和代码分析的攻击。它通过对代码进行优化和混淆,使得反编译后的代码难以理解和修改,从而增代码的安全性。 Maven是一个项目管理工具,用于构建、发布和管理Java项目的依赖关系。它可以帮助我们方便地管理项目的依赖关系,包括第三方库和插件。同时,它还提供了一些命令和配置,来支持多模块的项目结构。 在使用Spring Boot、ProGuardMaven实现代码混淆时,我们可以按照以下步骤进行操作: 1. 在Maven中创建一个多模块的项目结构。通过使用Maven的父子项目关系,我们可以在一个主项目中管理多个子模块。 2. 在子模块中引入Spring Boot和ProGuard的依赖。在子模块的pom.xml文件中,添对Spring Boot和ProGuard的相关依赖配置。 3. 配置ProGuard混淆规则。在子模块中创建一个proguard.cfg文件,并添相关的混淆规则。这些规则可以用于指定哪些类、方法和字段需要进行混淆,以及如何进行混淆。 4. 在Maven的构建过程中,添ProGuard的插件配置。通过对Maven的插件进行配置,使得在构建项目时自动应用ProGuard混淆规则。 5. 构建和执行项目。在Maven中使用命令进行项目的构建和执行,观察代码是否已经被混淆。如果一切顺利,你将会得到一个经过混淆代码。 综上所述,通过使用Spring Boot、ProGuardMaven,我们可以实现对Java代码混淆保护。这种方式可以增代码的安全性,防止代码被逆向工程和代码分析的攻击。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值