侧边栏壁纸
博主头像
mayrain

世界是一片荒原

  • 累计撰写 5 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

使用classFinal进行jar包加密并绑定机器码

mayrain
2024-11-02 / 0 评论 / 0 点赞 / 78 阅读 / 0 字

ClassFinal

介绍

ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。

github:https://github.com/roseboy/classfinal
gitee:https://gitee.com/roseboy/classfinal

功能特性

  • 无需修改原项目代码,只要把编译好的jar/war包用本工具加密即可。
  • 运行加密项目时,无需求修改tomcat,spring等源代码。
  • 支持普通jar包、springboot jar包以及普通java web项目编译的war包。
  • 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。
  • 支持maven插件,添加插件后在打包过程中自动加密。
  • 支持加密WEB-INF/lib或BOOT-INF/lib下的依赖jar包。
  • 支持绑定机器,项目加密后只能在特定机器运行。
  • 支持加密springboot的配置文件。

命令行加密

下载 classfinal-fatjar-1.2.1.jar

下载地址

加密

将打包的 jar 包与classfinal-fatjar-1.2.1.jar 置于同一目录下,运行命令行:

java -jar classfinal-fatjar.jar -C

得到机器码:

16:49:56 with qianyan in phd/0_project/jar via ☕ v1.8.0_282 via 🅒 base
➜ java -jar classfinal-fatjar-1.2.1.jar -C

=========================================================
=                                                       =
=       Java Class Encryption Tool v1.2.1   by Mr.K     =
=                                                       =
=========================================================

Server code is: 1B10226F9320E9E3E717D451F72D718FF0346C10480D2A82296ABDB7E4EA0765A4DEE6CC49F46F6DD442915CB1A52E0F
==>/Users/qianyan/phd/0_project/jar/classfinal-code.txt

使用如下命令行对 jar 包进行加密:

java -jar classfinal-fatjar-1.2.1.jar -file app-ops-user.jar -packages com.app.ops.user -cfgfiles bootstrap.yml -pwd neuNEU210 -code 1B10226F9320E9E3E717D451F72D718FF0346C10480D2A82296ABDB7E4EA0765A4DEE6CC49F46F6DD442915CB1A52E0F

参数说明:

参数说明
-file        加密的jar/war完整路径
-packages    加密的包名(可为空,多个用","分割)
-libjars     jar/war包lib下要加密jar文件名(可为空,多个用","分割)
-cfgfiles    需要加密的配置文件,一般是classes目录下的yml或properties文件(可为空,多个用","分割)
-exclude     排除的类名(可为空,多个用","分割)
-classpath   外部依赖的jar目录,例如/tomcat/lib(可为空,多个用","分割)
-pwd         加密密码,如果是#号,则使用无密码模式加密
-code        机器码,在绑定的机器生成,加密后只可在此机器上运行
-Y           无需确认,不加此参数会提示确认以上信息

在同目录下得到:app-ops-user-encrypted.jar,加密后的 jar 文件;加密后的文件不可直接执行,需要配置 javaagent

启动加密后 jar 包

加密后的项目需要设置 javaagent 来启动,项目在启动过程中解密 class,完全内存解密,不留下任何解密后的文件。解密功能已经自动加入到 yourpaoject-encrypted.jar 中,所以启动时-javaagent与-jar相同,不需要额外的jar包。

启动 jar 项目执行以下命令:

java -javaagent:app-ops-user-encrypted.jar='-pwd neuNEU210' -jar app-ops-user.jar

若命令行中不配置密码,启动后在控制台里输入密码,命令行如下:

java -javaagent:app-ops-user-encrypted.jar -jar app-ops-user-encrypted.jar

image.png

若绑定机器码后在其他机器上运行,得到如下结果:

image.png

maven

在要加密的项目 pom.xml 中加入以下插件配置:

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <!-- 生成spring boot jar包使用 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>net.roseboy</groupId>
            <artifactId>classfinal-maven-plugin</artifactId>
            <version>1.2.1</version>
            <configuration>
                <password>neuNEU210</password><!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码-->
                <packages>com.app.ops.*,mapper</packages>
                <libjars>*.jar</libjars>
                <cfgfiles>*.yml</cfgfiles>
                <code>1B10226F9320E9E3E717D451F72D718FF0346C10480D2A82296ABDB7E4EA0765A4DEE6CC49F46F6DD442915CB1A52E0F</code>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>classFinal</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

使用 mvn package 后得到 加密后的 jar 包 app-ops-user-encrypted.jar

测试

正常 springboot 项目的class文件在 \BOOT-INF\classes\ 路径下,在这个路径下查看业务代码,通过反编译工具可以看到,ClassFinal加密完代码后,原始的class文件并不会完全被加密,只是方法体被清空,保留方法参数、注解等信息,这是为了兼容 spring,swagger 等扫描注解的框架;方法体被清空后,反编译者只能看到方法名和注解,看不到方法的具体内容:

image.png

0

评论区