SpringBoot Jar 包加密防止反编译实战

开发
今天给大家分享一个 SpringBoot 程序 Jar 包加密的方式,通过代码加密可以实现无法反编译。

今天给大家分享一个 SpringBoot 程序 Jar 包加密的方式,通过代码加密可以实现无法反编译。

应用场景就是当需要把公司的产品部署到友方公司或者其他公司时,可以防止客户直接反编译出来源码,大大提升代码的安全性。

版本

  • springboot 2.6.8
  • jdk8

一、proguard-maven-plugin

第一种方式就是使用代码混淆的方式,可以参考proguard-maven-plugin插件使用,因为配置复杂,用起来太麻烦,本文不做重点介绍。

https://github.com/wvengen/proguard-maven-plugin

二、classfinal-maven-plugin

第二种方式就是使用代码加密的方式,classfinal-maven-plugin方式比较简单,只需要在pom.xml文件中引入一个plugin,然后简单的修改几项配置即可使用。

这种方式不仅可以对代码进行加密,对配置文件application.yml、lib 下的依赖也可以加密。

还可以指定机器运行程序。

https://gitee.com/roseboy/classfinal

三、实战

下面我们实战一下,首先创建一个 SpringBoot 程序,在 pom.xml 中加入。

需要注意的是,该插件需要放到spring-boot-maven-plugin后面

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <!--
                        1. 加密后,方法体被清空,保留方法参数、注解等信息.主要兼容swagger文档注解扫描
                        2. 方法体被清空后,反编译只能看到方法名和注解,看不到方法体的具体内容
                        3. 加密后的项目需要设置javaagent来启动,启动过程中解密class,完全内存解密,不留下任何解密后的文件
                        4. 启动加密后的jar,生成xxx-encrypted.jar,这个就是加密后的jar文件,加密后不可直接执行
                        5. 无密码启动方式,java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
                        6. 有密码启动方式,java -javaagent:xxx-encrypted.jar='-pwd= 密码' -jar xxx-encrypted.jar
                    -->
                <groupId>net.roseboy</groupId>
                <artifactId>classfinal-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <password>#</password><!-- #表示启动时不需要密码,事实上对于代码混淆来说,这个密码没什么用,它只是一个启动密码 -->
                    <excludes>org.spring</excludes>
                    <packages>${groupId}</packages><!-- 加密的包名,多个包用逗号分开 -->
                    <cfgfiles>application.yml,application-dev.yml</cfgfiles><!-- 加密的配置文件,多个包用逗号分开 -->
                    <libjars>hutool-all.jar</libjars> <!-- jar包lib下面要加密的jar依赖文件,多个包用逗号分开 -->
                    <code>xxxxx</code> <!-- 指定机器启动,机器码 -->
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>classFinal</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

上述代码中的机器码可以使用如下工具生成,进去之后点击下载。

https://repo1.maven.org/maven2/net/roseboy/classfinal-fatjar/1.2.1/classfinal-fatjar-1.2.1.jar

然后执行,注意最后参数为大写的C。

java -jar classfinal-fatjar-1.2.1.jar -C

最后将输出的机器码放入到上方的 code 中即可。

执行 Maven 命令打包即可,生成文件如下,其中EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar为生成的加密jar 包。

如需提供给客户,提供该包即可。

使用反编译工具,查看 jar 包中配置文件,可以看到配置文件已经为空。

反编译工具我这里用的是 luyten。

https://github.com/deathmarine/Luyten/releases/tag/v0.5.4_Rebuilt_with_Latest_depenencies

查看代码文件,可以看到方法体被清空,只保留了方法参数、注解等信息。

原理就是启动过程中进行解密,全是内存操作,非常安全。

无密码启动

例如我的 jar 包名称为EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar,那么执行命令如下:

java -javaagent:加密jar包的名称 -jar 加密jar包的名称
java -javaagent:EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar -jar EncryptDemo-0.0.1-SNAPSHOT-encrypted.jar

有密码启动

有密码启动与无密码启动类似,只是启动之后会提示输入密码,按照提示输入密码即可。

如果机器码不匹配,会提示该项目不可在此机器上运行!

正常启动截图如下:

源代码如下:https://github.com/zuiyu-main/EncryptDemo.git

分支:jar-encry

最后介绍一下  ClassFinal ,ClassFinal 能够对class文件进行加密,支持直接加密jar包或者war包,无需修改任务代码,兼容spring framework,可避免源码泄露或者字节码被反编译。

目前看官方介绍支持的功能如下:

  • 支持编译好的 jar/war 加密。
  • 运行加密项目,无需修改源代码。
  • 支持普通jar 包。springboot的jar包,tomcat的war包。
  • 支持 spring framework、swagger等在启动过程中扫描注解或者生成字节码的框架。
  • 支持maven 插件,添加插件即可自动加密。
  • 支持加密lib文件下的依赖。
  • 支持绑定机器运行。
  • 支持加密 springboot 配置文件。
责任编辑:赵宁宁 来源: 醉鱼Java
相关推荐

2024-09-13 08:57:25

SpringJar项目

2021-12-17 14:27:52

jar反编译Java

2015-01-15 11:01:43

2018-05-11 10:16:41

微信小程序反编译

2023-09-01 08:26:06

SpringBootjar包war包

2010-09-25 10:32:52

Java字节码

2021-12-10 10:05:27

Java反编译jar

2018-05-11 10:22:05

小程序源码分析

2015-07-20 16:37:11

2011-05-31 14:52:13

Android 反编译 方法

2015-08-20 10:13:34

2021-03-07 16:31:35

Java编译反编译

2017-02-20 13:54:14

Java代码编译

2015-01-15 10:15:16

Android反编译-smail语法

2022-02-13 20:31:26

SpringBootjarmanifests

2011-05-31 14:38:04

Android 反编译

2011-04-20 10:32:44

java反编译

2011-05-31 14:18:17

2009-06-11 14:11:33

代码混淆Java反编译

2015-07-13 15:52:18

反编译Android APK
点赞
收藏

51CTO技术栈公众号