首页 > 其他分享 >【SpringBoot安全】SpringBoot Jar 包加密防止反编译实战

【SpringBoot安全】SpringBoot Jar 包加密防止反编译实战

时间:2024-10-06 23:34:48浏览次数:8  
标签:反编译 加密 SpringBoot plugin jar Jar maven classfinal

一、proguard-maven-plugin

二、classfinal-maven-plugin

三、实战

原创 醉鱼 醉鱼Java

今天给大家分享一个 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 配置文件。

参考

标签:反编译,加密,SpringBoot,plugin,jar,Jar,maven,classfinal
From: https://www.cnblogs.com/o-O-oO/p/18449614

相关文章

  • SpringBoot 多元化配置(正则表达式,配置文件优先级)
    1.配置绑定所谓“配置绑定”就是把配置文件中的值与JavaBean中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过Java代码去读取该配置文件,并且把配置文件中指定的配置封装到JavaBean(实体类)中。SpringBoot提供了以下2种方式进行配......
  • 基于java+springboot的酒店预定网站、酒店客房管理系统
    该系统是基于Java的酒店客房预订系统设计与实现。是给师弟开发的毕业设计。现将源代码开放出来,感兴趣的同学可以下载。演示地址前台地址:http://hotel.gitapp.cn后台地址:http://hotel.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址https://git......
  • 基于java+springboot的租房网站、房屋出租管理系统
    该系统是基于java+springboot+vue开发的租房管理系统。是给师弟开发的课程作业。学习过程中,遇到问题可以留言咨询。演示地址前台地址:http://zf.gitapp.cn后台地址:http://zf.gitapp.cn/admin后台管理帐号:用户名:admin123密码:admin123源码地址https://github.com/g......
  • 常见问题解决 --- maven手动安装依赖jar包报错
    报错内容:执行命令mvninstall:install-file-DgroupId=com.beidouapp-DartifactId=SSDK-Dversion=4.0.2.0 -Dfile=C:\1\SSDK-Release-4.0.2.0.jar-Dpackaging=jar报错Unknownlifecyclephase“.ggstar“.Youmustspecifyavalidlifecyclephaseoragoal原因:在pow......
  • java毕业设计-基于Springboot的助农产品采购平台【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SSM数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能商家管理:负责商家入驻、审核、信息及商品上架权限......
  • 基于SpringBoot+Vue+协同过滤算法的音乐推荐系统设计与实现(源码+论文+PPT+部署文档教
    具体实现截图网站首页页面主要包括系统首页、热门歌曲、音乐资讯、留言板、个人中心等内容,并根据需要进行详细操作;如图5-1所示:图5-1网站首页界面图在注册流程中,用户在Vue前端填写必要信息(如用户名、密码等)并提交。前端将这些信息通过HTTP请求发送到Java后端。后端处理......
  • springboot+vue基于的电商购物系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为现代社会不可或缺的一部分。电子商务不仅改变了人们的购物方式,还极大地推动了全球经济的发展。近年来,电商平台如雨后春笋般涌现,市场竞争日益激烈。为了在激烈的市场竞争中脱颖而出,电商平台需要......
  • springboot+vue基于SpringBoot的经典诗文学习平台【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景在信息化高速发展的今天,传统文化的学习与传播方式正经历着深刻的变革。经典诗文作为中华文化的瑰宝,承载着千年的智慧与情感,对于提升国民文化素养、增强民族认同感具有重要意义。然而,传统的学习方式如翻阅纸质书籍、参加诗词讲座等,在时......
  • springboot社区管理系统-计算机毕业设计源码68405
     基于微信小程序的社区管理系统的设计与实现摘要随着移动互联网的快速发展,微信小程序作为一种轻量级的应用程序,因其便捷性、易用性和广泛的用户基础,已成为连接用户与服务的重要桥梁。特别是在社区管理领域,微信小程序以其独特的优势,为社区提供了一个全新的管理和服务模式。......
  • 【Shiro】3.Springboot实现缓存
    最近已经快速入门了Shiro。对于登录、授权、认证等方法,每次都是从数据库直接查询。如果登录的人员过多,对数据库来说,是一项压力。如何减轻数据库的压力。EhCache实现缓存集成Redis实现Shiro缓存(推荐使用)在此之前,我们已经简单学会EhCache和Reids的使用。EhCache实现缓......