SpringBoot(四十二)SpringBoot集成classfinal加密Jar包

603 阅读3分钟

上文中,我们使用jasypt对项目中application.yml配置文件进行了加密。很多时候我们在将项目打成jar包之后,也是不希望被反编译的,毕竟是我们自己辛苦写的代码。

 

那怎么办呢?

 

有现成的轮子供我们使用:classfinal

 

官网:gitee.com/roseboy/cla…

 

这是一个开源项目,是的,这是一个开源项目,所以呢,classfinal混淆代码也不是一定不会被反编译的,这里要注意。

 

Classfinal是使用探针技术对jar包进行加密,简单理解就是类似于aop切面编程,就是在代码运行前后对代码进行操作。很显然,classfinal就是在代码运行前对代码进行解密。那么如果我们看懂了classfinal对代码进行解密的算法。那就是可以对classfinal加密的jar包进行反编译操作的,从而获取到源码的。

 

如果classfinal加密操作不满足您的要求,可以尝试一下class-winter这个开源项目。

 

一:在pom文件中添加插件依赖

这部分原本很简单,如果你是一个单模块项目,自然是很简单的。但是呢,我是一个多模块项目。

 

我是现将插件写入了父项目的pom.xml中,但是在项目打包的时候,报错了。报错原因我这里就不展示了。

 

那么这个插件该放在哪个项目的pom.xml中呢?

 

放在入口模块的pom.xml中。

 

插件代码如下:

<!-- 加密插件 -->
<plugin>
    <groupId>net.roseboy</groupId>
    <artifactId>classfinal-maven-plugin</artifactId>
    <version>1.2.1</version>
    <configuration>
        <!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码,没有密码就是写#-->
        <password>#</password>
        <!-- 加密代码包                   -->
        <packages>com</packages>
        <!--加密配置文件-->
        <cfgfiles>application.yml</cfgfiles>
        <!-- 引用的jar 需要加密                   -->
        <libjars>config-0.0.1-SNAPSHOT.jar,controller-0.0.1-SNAPSHOT.jar,customAnnotations-0.0.1-SNAPSHOT.jar,dao-0.0.1-SNAPSHOT.jar,exception-0.0.1-SNAPSHOT.jar,filter-0.0.1-SNAPSHOT.jar </libjars>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>classFinal</goal>
            </goals>
        </execution>
    </executions>
</plugin>

 

二:打包

这部分正常打包就可以了。打包完成之后,来到target目录,如下图所示:

微信截图_20240929113003.png

多项目模块要是打包报错,你就多试试,一定会成功的。把心放胃里。

 

三:运行jar包

这部分才是重点。就是如何运行jar包呢?那肯定是不能跟正常没加密之前那样去运行。

 

加密后的项目需要设置javaagent来启动,项目在启动过程中解密class,完全内存解密,不留下任何解密后的文件。

 

解密功能已经自动加入到 xxx-encrypted.jar中,所以启动时-javaagent与-jar相同,不需要额外的jar包。

 

很简单,命令如下:

java -javaagent:entry-0.0.1-SNAPSHOT-encrypted.jar -jar entry-0.0.1-encrypted-SNAPSHOT.jar

 

对,就是这么简单。

 

我这里jar包是没有设置密码的,如果你的项目设置了密码,密码为123456,那么上边的命令应该修改为:

java -javaagent:entry-0.0.1-SNAPSHOT-encrypted.jar='pwd 123456' -jar entry-0.0.1-encrypted-SNAPSHOT.jar

 

就是在参数中配置一下密码就可以了。

 

以上大概就是使用classfinal对jar包进行加密的大概流程。

 

最后,还是重点说一下:classfinal的加密并非不可逆,如果对加密要求较高,不建议使用。

 

有好的建议,请在下方输入你的评论。