Spring Boot 项目代码混淆,实战来了,再也不用担心代码泄露了!

点击关注公众号,Java干货及时送达aa55f7de9e7b2c99bde634871d43ae85.png

266a2e03b6daad403174f59d6beb327d.png 学习 Spring Cloud 微服务的正确姿势!

bee8aed0db444903e6b7359bee64e985.png 你的一个 ChatGPT 账号待查收。


编译

简单就是把代码跑一哈,然后我们的代码 .java文件 就被编译成了 .class 文件

14b6ee99b70a95150df35d0c780e139a.png

反编译

就是针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来,可以看到你的代码写的啥。

比较常用的反编译工具 JD-GUI ,直接把编译好的jar丢进去,大部分都能反编译看到源码:

93d23a1c0708f0b30e276c71d61e5ddb.png

那如果不想给别人反编译看自己写的代码呢?

怎么做?

混淆

该篇玩的代码混淆 ,是其中一种手段。

我给你看,但你反编译看到的不是真正的代码。

先看一张效果示例图 :

e37a5a09bda83aef28926acdcd6e5af0.png

开搞

正文

先看一下我们混淆一个项目代码,要做啥?

014592e56722ca96ef2e055fe2bece9e.png

一共就两步

推荐一个开源免费的 Spring Boot 最全教程:

https://github.com/javastacks/spring-boot-best-practice

第一步, 在项目路径下,新增一份文件 proguard.cfg :

proguard.cfg

#指定Java的版本
-target 1.8
#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
-dontshrink
#是否关闭字节码级别的优化,如果不开启则设置如下配置
-dontoptimize
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
# 对于类成员的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
#混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
-adaptclassstrings

#对异常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# 此选项将保存接口中的所有原始名称(不混淆)-->
-keepnames interface ** { *; }
# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
#-keep interface * extends * { *; }
#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
-keepparameternames
# 保留枚举成员及方法
-keepclassmembers enum * { *; }
# 不混淆所有类,保存原始定义的注释-
-keepclassmembers class * {
                        @org.springframework.context.annotation.Bean *;
                        @org.springframework.beans.factory.annotation.Autowired *;
                        @org.springframework.beans.factory.annotation.Value *;
                        @org.springframework.stereotype.Service *;
                        @org.springframework.stereotype.Component *;
                        }

#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
-keep public class com.example.myproguarddemo.MyproguarddemoApplication {
        public static void main(java.lang.String[]);
    }

注意点:

bc96bffa6aad5c285dfcbd71cf3a9cd3.png

其余的看注释,可以配置哪些类不参与混淆,哪些枚举保留,哪些方法名不混淆等等。另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。

第二步,在pom文件上 加入proguard 混淆插件 :

build标签里面改动加入一下配置:

<build>
    <plugins>
        <plugin>
            <groupId>com.github.wvengen</groupId>
            <artifactId>proguard-maven-plugin</artifactId>
            <version>2.6.0</version>
            <executions>
                <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>proguard</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
                <injar>${project.build.finalName}.jar</injar>
                <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
                <outjar>${project.build.finalName}.jar</outjar>
                <!-- 是否混淆 默认是true -->
                <obfuscate>true</obfuscate>
                <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
                <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
                <!-- 额外的jar包,通常是项目编译所需要的jar -->
                <libs>
                    <lib>${java.home}/lib/rt.jar</lib>
                    <lib>${java.home}/lib/jce.jar</lib>
                    <lib>${java.home}/lib/jsse.jar</lib>
                </libs>
                <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
                <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
                <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
                <outputDirectory>${project.basedir}/target</outputDirectory>
                <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
                <options>
                    <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
                </options>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.example.myproguarddemo.MyproguarddemoApplication</mainClass>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

注意点:

790c6d8a79fb8765f0bb73698e580ebf.png 2c4295520636305d22891cc8c9b92512.png

然后可以看到:

12aa41defc6d8c11409db4c590d941f9.png

然后点击package,正常执行编译打包流程就可以 :

cedde0cdcdfcf675d81f72056269ca88.png

然后可以看到jar的生成:

4b5f200fe5a4db870404c5d1b6fac1ca.png

看看效果:

cfe5a8b1e885b6652f3563bf06e6c235.png

好了,该篇就到这。

本文链接:https://blog.csdn.net/qq_35387940/article/details/127426354


最近 ChatGPT 太火爆啦,有人靠它提高工作效率,有人靠它赚了第一桶金,但也有很多人对 ChatGPT 还一无所知。。

朋友圈也经常有人找我咨询 ChatGPT,根本回答不过来,于是R哥创建了一个《ChatGPT小密圈》知识星球,和大家分享这个巨大的红利。

加入星球福利:

1、加入即送一个超难注册的 ChatGPT 账号,个人独享,一人一号。

2、星球分享了大量 ChatGPT 学习资料, ChatGPT 专栏目前还输出了 40+ 篇保姆级教程,持续更新中。

3、免费邀请进 ChatGPT 微信交流群,巨大红利期,群里不能太活跃,干货不能太多了。

c3240b8f73596f14c495ff42b61cac32.png真正的高质量 ChatGPT 知识星球,点击《ChatGPT小密圈》知识星球了解详情。

跟上时代步伐,快扫码加入吧:

f93e6c996aaf8657f8c1c101a2feceb8.jpeg

满 1000 人涨价啦,早就是优势!

ChatGPT 不会替代你,但掌握了它的人会!

End

d09a77c1f3d62afded4db0902233000e.png 学习 Spring Cloud 微服务的正确姿势!

42d6be87318a4040ddbea19499cc3e3b.png 用上 ChatGPT 啦,强的离谱!

e808a1f8ed40c7f0effd2b2336f0629d.png ChatGPT 这次赢麻了。。。

da3d871bd25803343d44ba6e65e31711.png 怎么删除 HashMap 中的重复元素?

99b78923ca4f9beb2c334484e76b6043.png Java 20 正式发布,超神了。。

ddb7a405b7c7881ee9afa24bb37236c1.jpeg

52389f1298bc76176e53306cef30d7e8.gif

Spring Cloud 微服务最新课程!

猜你喜欢

转载自blog.csdn.net/youanyyou/article/details/129980258