SpringBoot结合ProGuard实现代码混淆(最新版)

网友投稿 3012 2022-11-18


SpringBoot结合ProGuard实现代码混淆(最新版)

前言

研究ProGuard也花了两天时间,其实最主要的时间花在前面proguard读取jar包的时候相关jar冲突的问题,但是总的来说不用拆分SpringBoot项目并且实现代码混淆已经很舒服了。

ProGuard集成

1.maven的配置

具体配置如下:

${artifactId}

com.github.wvengen

proguard-maven-plugin

package

proguard

6.2.2

${project.build.finalName}.jar

${project.build.finalName}.jar

true

SourceFile,LineNumberTable, *Annotation*,EnclosingMethod

-keep class com.jingchen.ccny.CmepApplication { *; }

-keep class * {

@org.springframework.beans.factory.annotation.Autowired *;

@org.springframework.beans.factory.annotation.Value *;

@org.springframework.stereotype.Service *;

@org.springframework.stereotype.Component *;

@org.springframework.scheduling.annotation.Scheduled *;

}

${java.home}/lib/rt.jar

${java.home}/lib/jce.jar

net.sf.proguard

proguard-base

6.2.2

org.springframework.bzZyPUploot

spring-boot-maven-plugin

repackage

com.jingchen.ccny.CcnyApplication

这里里面级联引用的jar很多,建议配置了私服的人先把镜像地址配置成maven中央仓库地址,这样先下下来相关依赖的包,然后再上传到你们的私服上去。据我研究中知道的jar就有:

注意:不连外网配置maven中央仓库的话,少了jar你们会很头疼的。而且不止net.sf.proguard相关包,还包括了com.guardsquare.proguard-base 和 com.guardsquare.proguard-core 相关的jar,所以真的连外网下包很重要!!!!

推荐一个IDEA解决maven引用冲突的插件:Maven Helper

2.相关异常解决

idea A required class was missing … org/apache/tools/ant/BuildListener

问题原因:

这个问题就是上面提到的因为apache的编译用了一个ant-1.9.3的包,这个是级联引用的,开始我是内网maven私服,单纯的引入net.sf.proguard相关和com.github.wvengen相关的jar还是会缺少很多jar

解决方案:

连上外网,配置你的maven的setting.xml 的mirror镜像地址,配置成Maven中央仓库的地址,将相关的jar都下下来,然后再通过命令把你本地maven仓库的jar上传到私服去

Can't process class [META-INF/versions/9/org/apache/logging/log4j/util/Base64Util.class]

Can't process class [META-INF/versions/11/module-info.class]

问题原因

这个问题的原因有很多方面,最主要的就是我们的jdk版本是1.8,我最开始用的ProGuard是5.3.3版本,然而我们SpringBoot的版本是2.3.3版本,SpringBoot2.3.3版本太新了,里面引用的相关包都是java9和java11的版本,这样ProGuard在读jar的时候会无法识别。这些问题在提升Proguard版本到6.2.2之后都解决了

解决方案

开始我的解决方案是忽略这些相关的jar, 例如在pom.xml的option配置:

但是我这样配置之后,重新打包会提示:

The same input jar [E:\maven\repo\com\zaxxer\HikariCP\3.4.5\HikariCP-3.4.5.jar] is specified twice.

解决方案:

而且我还尝试了maven引用的时候排除这些高版本的级联引用jar,单独引用低版本,但最终还是因为太繁琐而放弃了。直接提升Proguard版本到6.2.2 这些读jar的版本问题就解决了。Annotation-specified bean name ‘a' for bean class

问题原因:

出现这个问题主要还是混淆之后,bean重名了,spring默认是把类名的首字母小写加载到容器里面,我们混淆类名之后,就容易造成beanName重复。

解决方案:

庆幸的是,我们可以通过改变spring加载bean的命名策略来解决这个问题,把包名带上,同时在获取Spring上下文getBean的时候,加上包名路径即可

启动类配置,具体如下:

@SpringBootApplication

public class CcnyApplication{

public static class CustomGenerator implements BeanNameGenerator {

@Override

public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {

return definition.getBeanClassName();

}

}

public static void main(String[] args) {

SpringApplicationBuilder sab=new SpringApplicationBuilder(CcnyApplication.class)

.beanNameGenerator(new CustomGenerator());

//这里如果想打印你加载的Spring的bean,可以这样做:

ApplicationContext ac =sab.run(args);

Arrays.stream(ac.getBeanDefinitionNames()).forEach(System.out::println);

}

}

这样配置,你启动的时候就能看到加载的所有的beanName(这里Service会带上package路径)

其他地方getBean的用法:

//这里的packagePath = com.jingchen.ccny.service

CallBackGuiService callBackGuiService = (CallBackGuiService) SpringUtil.getBean(packagePath+serviceName);

callBackResult = callBackGuiService.excute(convertMap);

这样你就能正常的获取到Spring容器加载的beanName了

注意事项

基本上影响打包和启动的就上面一些问题了,其他的就是你们项目里面的细节了,

比如DAO要保留,要和mybatis里面的Mapper映射对应,DAO里面的方法传参要改为map或者实体,另外序列化后的实体要保留

Controller里面的方法入参,如果用了实体,这部分实体也要保留(保证其变量不会被混淆,不然传值收不到)

另外就是你们spring相关的XML里面,如果单独配置了Bean和Bean属性的,这类bean要保留,不能被混淆

我这里保留了所有的接口和接口里面的方法,已经我们自定义的抽象类BaseService里面的方法名不会被混淆,这些你们可以自己定义,而且我这里定义了有标注@Component的类也保留类名,按照我上面的配置,基本上可以不用重新构建beanName。正常的application启动就完事了

其他的没了,就看你们还有没有什么特定的类不能被混淆,以及你们要混淆的力度(我们的要求是保留所有类名、接口信息和抽象类信息,除此之外的所有类和方法都被混淆!)

总的来说花了两天时间,有这样的成果也是值得高兴的,前一天解决jar冲突的比较多,主要原因就是最开始XX架构师搭建这个项目采用最新的SpringBoot版本,jdk确是1.8 , 很多不兼容。

来个最终的效果图吧:

参考案例

1、Springboot+proguard+maven 混淆.

2、proguard-spring-boot-example

3、官方解释

4、Proguard的Keep使用方法

5、ProGuard 最全混淆规则说明

6、ProGuard代码混淆技术详解

7、使用proguard混淆springboot代码


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决springcloud Zuul丢失Cookie的问题
下一篇:Spring Boot如何整合FreeMarker模板引擎
相关文章

 发表评论

暂时没有评论,来抢沙发吧~