[进来复制]springboot项目代码混淆,帮你安排的明白的混淆代码!

首先感谢俩篇博文博主本文是基于以下俩个博文进行的,楼主也是忙活了大半天整这个混淆,本以为可以快速完成的,没成想耗时耗力。
详细的springboot结合proguard做代码混淆,感谢。
其他博主的踩坑锦集,感谢。

  • 踩坑锦集
    1. Caused by: org.apache.maven.plugin.MojoExecutionException: Obfuscation failed (result=1) 这个错误最常见 其实使用mvn插件最常见的错误都是这个的,使用插件失败,其实没什么用 可以使用 mvn clean package -e -X 看的完整点 最主要的错误在这个异常上面 程序执行proguard插件抛出的异常
    2. java.io.IOException: You have to specify '-keep' options for the shrinking step
    3. proguard插件版本不兼容问题 百度搜的好多博文因为年代久远会出现版本跟jdk1.8不兼容https://mvnrepository.com mvn 地址贴出来 方便大家去改最新版
    4. 还要好多就不写了直接贴代码 需要更改的地方会加备注
<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>-keep class com.example.redis.** { *; }</option>
                        <option>-keep class com.example.domain.** { *; }</option>
                        <option>-keep class com.example.dto.** { *; } </option>
                        <option>-keep class com.example.config.**{ *; }</option>
                        <option>-keep class com.example.dao.** { *; }</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>

楼主导入plugins后jar包一些部分标红 idea点击build-> rebuild project 重新变一下试下。其他的编码软件不清楚
然后 需要在同级目录下建个proguard.cfg 文件
里面的内容要跟pom文件对应

pom中option标签中的都要在文本中再体现一次 比如加了
<option>-keep class com.example.domain.** { *; }</option>
文本里就要加-keep class com.example.domain.** { *; }


# JDK目标版本1.8
-target 1.8
# 不做收缩(删除注释、未被引用代码)
-dontshrink
# 不做优化(变更代码实现逻辑)
-dontoptimize
-ignorewarnings
# 不路过非公用类文件及成员
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames
# 优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
# 确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames
# 不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有 大量固定写法的包名
-keeppackagenames
-adaptclassstrings
# -keepdirectories 
# 不混淆所有特殊的类
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
# This option will save all original methods parameters in files defined in -keep sections, otherwise all parameter names will be obfuscate.
-keepparameternames
-keep interface * extends * { *; }
-keepclassmembers class * {
	@org.springframework.beans.factory.annotation.Autowired *;
	@org.springframework.beans.factory.annotation.Value *;
	}
 
# 混淆这个包下的类   此处需要更改
-keep class !com.package.service.** { *; }
-dontwarn **
# 不混淆main方法
-keep class com.package.Application { *; }

# 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射 
-keepclassmembers public class * {void set*(***);*** get*();}
 
# 不对包类的类名进行混淆,但对类中的属性和方法混淆

# 不混淆包下的所有类名,且类中的方法和属性也不混淆

执行mvn clean package 成功后 target目录
在这里插入图片描述

classes-pg.jar 是编译后的代码jar war里面的class文件还是没有变动的 ,是先生成的war才执行的mvn插件 可以手动更换。
更换class步骤

  1. 下载windowsrar
  2. 打开classes-pg.jar 把里面的文件拽出来 建个文件夹classes
  3. 打开war 在WEB-INF里面把classes文件替换掉就可以了
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: 代码混淆是一种保护项目源码安全性的措施,通过对代码进行混淆,可以防止别人通过反编译项目查看代码。在Spring Boot项目中进行代码混淆时,可能会遇到一些问题。比如,引用中提到ProGuard对于带有前缀的类文件名称识别不了,因此无法混淆。另外,引用中分享了使用Allatori-7.7进行代码混淆的步骤和反编译操作。另外,还可以通过修改Spring的bean命名策略来按类的全限定名来命名,以增加混淆的效果。例如,引用中的代码示例演示了如何修改Spring的bean命名策略。总之,要在Spring Boot项目中进行代码混淆,可以选择合适的工具,并根据项目的具体情况进行相应的配置和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring Boot 2.x系列【27】应用篇之代码混淆](https://blog.csdn.net/qq_43437874/article/details/127964743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [springboot项目代码混淆和反编译教程·附软件连接](https://blog.csdn.net/weixin_45095396/article/details/121564461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Springboot - 代码混淆](https://blog.csdn.net/trustnature/article/details/121668832)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值