对Springboot的jar加密:防止反编译

本文介绍使用XJar对SpringBoot项目打包后的JAR进行加密处理的方法,通过配置Maven依赖及运行main方法,实现对JAR文件的加密,使其无法被JD-GUI等工具反编译,同时提供加密后的JAR运行方式。

记录如下……

 

 

XJar

对Springboot打包后的jar加密处理后,jd-gui已不能反编译成功

github地址:https://github.com/core-lib/xjar

 

1 pom

<!-- 防止反编译加密 -->
        <dependency>
            <groupId>com.github.core-lib</groupId>
            <artifactId>xjar</artifactId>
            <version>4.0.0</version>
        </dependency>
<!-- xjar的依赖,否则会报错 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-compress</artifactId>
            <version>1.20</version>
        </dependency>


    <repositories>
        <repository>
            <id>jitpack</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>

2 通过main方法运行

    import io.xjar.XCryptos;

    public static void main(String[] args) throws Exception {
        produce();
    }

    public static void produce() throws Exception {
        XCryptos.encryption()
                // 项目生成的jar
                .from("D:\\projects\\test\\target\\test.jar")
                // 加密的密码
                .use("testaa1111122222")
                // 要加密的资源
                .include("/**/*.class")
                .include("/**/*.xml")
                .include("/**/*.yml")
                // 加密后的jar,此时:通过jd-gui反编译失败
                .to("D:\\temp\\test.jar");
    }

 

 

详细步骤说明:

1、对Springboot项目maven打包后生成的jar,以上述代码运行,可得到加密后的jar(此时加密的jar经jd-gui反编译报错)

2、生成加密jar的同时,目录下会生成xjar.go的GO启动器文件

3、对xjar.go编译(需要安装go环境,区分windows和linux),生成对应的go执行器。命令:

go build xjar.go

4、编译之后,得到执行器:

window:xjar.exe

linux:xjar

5、项目启动运行:

window:

xjar.exe java -jar test.jar

linux:

nohup ./xjar java -jar test.jar

6、此时jar通过xjar可正常运行

 

 

 

记录……

原文:https://blog.youkuaiyun.com/ChangeYoung1921/article/details/84621787

 

 

 

 

<think>我们正在讨论Spring Boot应用使用Maven构建时如何加密代码以防止反编译。用户希望保护他们的Java代码,避免被反编译工具轻易逆向工程。下面我将逐步介绍几种可行的方案,并说明如何在Maven项目中实施。 ### 方案1: 使用代码混淆工具(如ProGuard) 代码混淆是最常用的保护Java代码的方法之一。它通过重命名类、方法和字段,删除无用的元数据,以及优化字节码来使反编译后的代码难以阅读。 **步骤:** 1. **在Maven项目中集成ProGuard** 首先,在`pom.xml`中添加ProGuard Maven插件: ```xml <build> <plugins> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.6.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <obfuscate>true</obfuscate> <injar>${project.build.finalName}.jar</injar> <outjar>${project.build.finalName}-small.jar</outjar> <outputDirectory>${project.build.directory}</outputDirectory> <proguardInclude>${basedir}/proguard.conf</proguardInclude> <libs> <lib>${java.home}/lib/rt.jar</lib> </libs> </configuration> </plugin> </plugins> </build> ``` 2. **配置ProGuard规则** 在项目根目录下创建`proguard.conf`文件,配置混淆规则。例如: ``` -dontshrink -dontoptimize -keepparameternames -keep public class com.example.MainApplication { public static void main(java.lang.String[]); } -keepclassmembers class * { @org.springframework.context.annotation.Bean *; @org.springframework.stereotype.Service *; @org.springframework.stereotype.Component *; } ``` 此配置保留Spring Boot的入口类和注解的Bean,避免破坏Spring的依赖注入。 3. **构建项目** 运行Maven命令打包: ```bash mvn clean package ``` 构建完成后,会在`target`目录下生成混淆后的JAR文件(如`your-app-small.jar`)。 ### 方案2: 使用商业级代码保护工具(如Jscrambler, DexGuard) 对于更高级的保护(如控制流混淆、字符串加密等),可以考虑商业工具。这些工具提供更强大的保护,但通常需要付费。 **以Jscrambler为例:** 1. 在Jscrambler官网注册并获取配置。 2. 在Maven中集成Jscrambler插件(参考官方文档)。 3. 配置保护规则并构建。 ### 方案3: 使用类文件加密工具(如ClassFinal) [ClassFinal](https://github.com/roseboy/classfinal) 是一款基于字节码转换的Java类文件加密工具,支持Spring Boot项目。它通过对JAR包中的类文件加密,并在启动时通过Java Agent解密,从而防止直接反编译。 **步骤:** 1. **在Maven项目中集成ClassFinal** ```xml <plugin> <groupId>net.roseboy</groupId> <artifactId>classfinal-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <password>your-password</password> <!-- 加密密码 --> <packages>com.yourpackage</packages> <!-- 加密的包名 --> <excludes>org.spring</excludes> <!-- 排除的包名 --> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>classFinal</goal> </goals> </execution> </executions> </plugin> ``` 2. **构建项目** 运行`mvn clean package`,会在`target`目录生成两个文件: - `original-your-app.jar`: 原始JAR - `your-app-encrypted.jar`: 加密后的JAR(内含启动代理) 3. **运行加密后的JAR** 使用以下命令运行: ```bash java -javaagent:your-app-encrypted.jar='-pwd your-password' -jar your-app-encrypted.jar ``` ### 方案4: 自定义类加载器加密 如果对安全性要求极高,可以自定义类加载器,在类加载时解密字节码。这种方法需要: 1. 编写一个自定义类加载器,重写`findClass`方法,在其中解密字节码。 2. 使用工具(如Maven插件)在构建时加密所有类文件。 3. 将自定义类加载器作为入口,启动应用。 ### 注意事项 - **性能影响**:混淆和加密可能影响启动速度和运行性能,需测试。 - **兼容性**:确保保护工具与Spring Boot、第三方库兼容。 - **备份**:保留未混淆/未加密的原始代码,避免丢失。 ### 总结 以上方案中,ProGuard和ClassFinal是较为常用的免费方案。ProGuard提供基础的混淆,而ClassFinal提供类文件加密。商业工具(如Jscrambler)则提供更全面的保护。 §§相关问题§§ 1. ProGuard在Spring Boot项目中如何避免混淆Spring的注解? 2. ClassFinal加密后的JAR文件如何防止内存dump? 3. 除了代码混淆和加密,还有哪些方法可以保护Java应用的安全?</think>### Spring Boot Maven项目代码加密防止反编译指南 在Spring Boot项目中,使用Maven构建时防止代码反编译的核心方案是**代码混淆**和**字节码加密**。以下是具体实现方案: #### 方案1:使用ProGuard进行代码混淆(推荐) ProGuard通过重命名类/方法/字段名、删除无用代码和优化字节码,使反编译后的代码难以阅读。 **实施步骤:** 1. 在`pom.xml`中添加ProGuard插件: ```xml <build> <plugins> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.6.0</version> <executions> <execution> <phase>package</phase> <goals><goal>proguard</goal></goals> </execution> </executions> <configuration> <obfuscate>true</obfuscate> <injar>${project.build.finalName}.jar</injar> <outjar>${project.build.finalName}-small.jar</outjar> <proguardInclude>${basedir}/proguard.conf</proguardInclude> <libs> <lib>${java.home}/lib/rt.jar</lib> </libs> </configuration> </plugin> </plugins> </build> ``` 2. 创建`proguard.conf`配置文件: ``` -keep public class com.example.MainApplication { public static void main(java.lang.String[]); } -keepclassmembers class * { @org.springframework.context.annotation.Bean *; @org.springframework.stereotype.* *; } ``` 3. 构建命令: ```bash mvn clean package ``` #### 方案2:使用ClassFinal进行字节码加密 [ClassFinal](https://github.com/roseboy/classfinal) 在启动时通过Java Agent动态解密类文件。 **实施步骤:** 1. 添加Maven插件: ```xml <plugin> <groupId>net.roseboy</groupId> <artifactId>classfinal-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <password>yourPassword</password> <!-- 加密密钥 --> <packages>com.yourpackage.*</packages> <excludes>org.spring.*</excludes> </configuration> <executions> <execution> <phase>package</phase> <goals><goal>classFinal</goal></goals> </execution> </executions> </plugin> ``` 2. 启动加密后的JAR: ```bash java -javaagent:your-app-encrypted.jar='-pwd yourPassword' -jar your-app-encrypted.jar ``` #### 方案3:商业级保护工具(高安全性需求) | 工具 | 特点 | 费用 | |---------------|-----------------------------------|----------| | Jscrambler | 控制流混淆、字符串加密 | 商业授权 | | Zelix KlassMaster | 高级混淆、水印功能 | 商业授权 | | DashO | 预检分析、主动防御 | 商业授权 | #### 最佳实践建议 1. **分层保护**:结合ProGuard(基础混淆) + ClassFinal(启动时解密) 2. **密钥管理**:将加密密钥存储在环境变量中,避免硬编码 3. **排除配置**:不要混淆Spring Boot启动类和注解(如`@SpringBootApplication`) 4. **依赖处理**:排除第三方库的混淆(在配置中使用`-keep class com.fasterxml.**`) 5. **镜像加速**:在`settings.xml`配置阿里云镜像加速依赖下载[^5] #### 验证效果 反编译测试命令: ```bash # 使用JD-GUI验证 java -jar jd-gui.jar your-encrypted-app.jar ``` 成功保护的代码将显示为: - 类/方法名被重命名为`a`,`b`,`c`等无意义字符 - 核心逻辑代码无法直接阅读 > ⚠️ 注意:没有绝对安全的方案,但上述方法可显著提高反编译难度。商业项目建议使用商业级混淆工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值