目录

    SpringBoot 项目 Jar 包加密,防止反编译


    SpringBoot 项目 Jar 包加密,防止反编译

    一.使用场景

    在实际开发中,有时候我们可能需要对 SpringBoot 项目的 Jar 包进行加密,以防止他人对代码的反编译和恶意使用。以下是一些常见的使用场景:
    1.商业应用保护:如果你的 SpringBoot 项目是一个商业应用,你可能希望将核心代码进行加密,以避免竞争对手或黑客窃取关键业务逻辑和算法。
    2.安全性要求高的应用:某些应用程序可能处理敏感数据,如金融、医疗或政府数据等。在这种情况下,加密 Jar 包可以提供额外的安全层,确保数据和代码的机密性。
    3.防止反编译:通过加密 Jar 包,你可以大幅降低他人对代码的理解和修改难度,从而减少源代码泄漏的风险,并阻碍恶意用户进行反编译、篡改和滥用代码。
    4.保护知识产权:对于一些重要的知识产权,如算法、模型等,加密 Jar 包可以有效地防止他人窃取和复制这些知识产权,保护你的技术优势和商业利益。

    二.加密方案

    采用 ClassFinal

    ClassFinal 是一款 java class 文件安全加密工具,支持直接加密 Jar 包或 War 包,无需修改任何项目代码,兼容 spring-framework,可避免源码泄漏或字节码被反编译,并且可以对 yml、properties 配置文件以及 lib 目录下的 maven 依赖进行加密处理。支持绑定机器,项目加密后只能在特定机器运行。

    ClassFinal项目源码地址

    三.配置使用

    只需要在项目的 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>${project.groupId}</packages>
                    <!-- 加密的配置文件,多个包用逗号分开 -->
                    <cfgfiles>application.yml,application-dev.yml,application-prod.yml</cfgfiles>
                    <!-- jar包lib下面要加密的jar依赖文件,多个包用逗号分开 -->
                    <libjars>hutool-all.jar</libjars>
                    <!-- 指定机器启动,机器码 -->
                    <code>xxxx</code>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>classFinal</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    四.启动方式

    1.无密码启动

    java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar
    

    2.有密码启动

    java -javaagent:xxx-encrypted.jar='-pwd=密码' -jar xxx-encrypted.jar
    

    3.绑定机器启动

    下载 classfinal-fatjar-1.2.1.jar 包,在下载的包所在路径下 cmd 执行 java -jar classfinal-fatjar-1.2.1.jar -C 命令,会自动生成一串机器码:

    classfinal-fatjar-1.2.1.jar生成机器码

    将此生成好的机器码,放到 maven 插件中的 code 里面即可。这样,打包好的项目只能在生成机器码的机器运行,其他机器则启动不了项目。

    ClassFinal对Jar加密后只能在特定机器运行

    五.反编译效果

    启动包加密之后,方法体被清空,保留方法参数、注解等信息。主要兼容 swagger 文档注解扫描,反编译只能看到方法名和注解,看不到方法体的具体内容。启动过程中解密 class,完全内存解密,不留下任何解密后的文件。

    ClassFinal加密后反编译效果

    end
  1. 作者: 锋哥 (联系作者)
  2. 发表时间: 2023-12-29 22:26
  3. 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  4. 转载声明:如果是转载博主转载的文章,请附上原文链接
  5. 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  6. 评论

    站长头像 知录

    你一句春不晚,我就到了真江南!

    文章0
    浏览0

    文章分类

    标签云