jar包加密防止反编译--classFinal

本文介绍了一种名为ClassFinal的工具,用于在部署项目到第三方服务器时加密源码,防止代码泄露。提供了详细的配置指南及如何使用Maven插件进行加密的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有这样的需求,我们项目要部署在其他公司的服务器上,但是又不想让外人看到我们的源码。所以要对jar包中的内容进行加密。

加密方式一般有二,一是可以对class文件中的内容进行混淆,对类名和方法名等进行替换,使得代码阅读困难,但是不影响代码逻辑,多花时间还是可以解读出来的。二是对class文件进行一些操作加密,运行的时候再进行解密。

网上找了几个,觉得还是classFinal这个比较满意,加密选择灵活,支持springboot项目,操作简单。
项目地址:https://gitee.com/roseboy/classfinal

将项目下载下来,打卡README.md文档,里面介绍了几种使用方法。
我选择的是使用maven插件加密的方式。
在pom文件中加入:

    <!-- https://gitee.com/roseboy/classfinal -->
    <groupId>net.roseboy</groupId>
    <artifactId>classfinal-maven-plugin</artifactId>
    <version>${classfinal.version}</version>
    <configuration>
        <password>000000</password><!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码-->
        <packages>com.yourpackage,com.yourpackage2</packages>
        <cfgfiles>application.yml</cfgfiles>
        <excludes>org.spring</excludes>
        <libjars>a.jar,b.jar</libjars>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>classFinal</goal>
            </goals>
        </execution>
    </executions>
</plugin>

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

这样在执行maven的package命令的时候就会自动在target目录下生成加密后的jar包。
将自己需要的配置设置好之后,最好重新一下install一下maven的包,然后package。
在target中出现了加密前的jar包和加密后的jar包:
在这里插入图片描述
使用Javaagent命令启动项目:

java -javaagent:yourpaoject-encrypted.jar -jar yourpaoject-encrypted.jar

回车后会让输密码,没有设置密码的话直接再次回车,项目启动成功!

我们打开加密后的jar包看一下加密效果:
在这里插入图片描述
可以看到加密后,方法中的实现被隐藏掉了。加密的需求达到了。
当项目启动后,class被classloader加载时,真正的方法体会被解密注入。

如何在指定机器上使用?
在maven的插件配置上添加< code >标签,里面的机器码内容需要手动去生成。
将classFinal的项目中的ckassFinal-fatjar模块打成jar包
执行java -jar classfinal-fatjar.jar -C 命令。
会生成机器码,在target目录中也会有一份

在这里插入图片描述

在这里插入图片描述
将机器码填入code标签再package即可。
这样jar包就只能在生成机器码的设备上使用,在别的设备使用启动jar包的时候会报出机器码有误的内容。

<think>好的,我现在要解决用户的问题:为什么使用classfinal-fatjar-1.2.1对JAR加密后,仍然可以通过压缩方式查看源码,以及如何解决这个问题。首先,我需要理解用户的具体情况。 用户使用ClassFinal工具对JAR进行加密,但加密后的JAR仍然可以用压缩软件打开并看到源码。这说明加密可能没有正确应用,或者用户对加密的理解有误。我需要先了解ClassFinal的工作原理。 首先,ClassFinal主要对字节码进行加密,而不是对JAR的整体结构进行加密。标准的JAR是ZIP格式,即使字节码被加密,压缩软件仍然可以解压查看文件,只是这些文件(比如.class文件)的内容会被混淆或加密,无法直接阅读。但用户提到能看到源码,这可能意味着加密过程有问题,或者用户误将源代码而非编译后的.class文件打进去。 接下来,我需要检查可能的几个原因: 1. **加密配置是否正确**:用户是否在配置文件中正确指定了需要加密或类?如果配置错误,可能部分或全部类未被加密。 2. **是否含源代码文件**:用户可能错误地将.java文件打JAR,而不是只含编译后的.class文件。如果JAR含未加密的.java文件,自然可以直接查看。 3. **加密工具的限制**:ClassFinal可能不会对资源文件进行加密,如果用户把源码作为资源文件含进去,这些文件可能仍然可见。 4. **加密方式的理解**:用户是否混淆了代码混淆和加密?混淆只是让代码难以阅读,但文件依然可见。而加密后的文件需要特定的类加载器解密才能运行。 解决方法可能括: - 确保正确配置加密工具,只打.class文件,检查加密后的.class文件是否被正确处理。 - 使用其他工具进行二次混淆或加密,或者结合JAR加固措施,比如将JAR转换为exe,或使用更强大的加密工具。 - 检查构建流程,避免将源代码打进去。 同时,用户提供的引用中有关于编译和配置的内容(如引用3和4),可能需要用户检查构建脚本,确保在打前处理了源代码,只加密后的.class文件。 总结来说,问题可能出在配置错误、含源代码文件或对工具功能的理解偏差。需要一步步排查这些可能性,并提供对应的解决方案。</think>### 为何使用ClassFinal加密后仍可查看源码? #### 原因分析 1. **ClassFinal的工作机制** ClassFinal主要对JAR中的`.class`文件进行字节码加密或混淆,但加密后的文件仍以`.class`格式存在,JAR本身是ZIP压缩格式,因此可以通过压缩软件查看文件结构。若加密未生效或配置错误,可能保留未加密的源码或资源文件[^1][^3]。 2. **可能含未加密的源码文件** 若JAR中意外含未编译的`.java`文件或未加密的资源文件(如XML、配置文件),可直接通过解压查看[^4]。 3. **加密范围配置错误** ClassFinal需通过配置文件指定需加密或类。若配置未覆盖全部目标代码,部分文件可能未加密--- ### 解决方案 #### 1. 验证加密配置 - **检查ClassFinal配置文件** 确保`classfinal.yml`中正确指定了需加密名或类名,例如: ```yaml packages: - com.example.* ``` - **加密后验证** 使用反编译工具(如JD-GUI)检查加密后的`.class`文件是否已被混淆或加密(显示为乱码或无法反编译)。 #### 2. 排除源码文件 - **清理构建流程** 在Maven/Gradle构建时,确保仅打编译后的`.class`文件,排除`.java`文件。例如在`pom.xml`中添加: ```xml <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> </resources> ``` #### 3. 增强加密措施 - **结合代码混淆工具** 使用ProGuard或Allatori对代码进行混淆,再使用ClassFinal加密,提升安全性。 - **使用自定义类加载器** 实现自定义类加载器解密字节码,防止直接反编译(需结合加密工具支持)。 #### 4. 转换JAR为EXE - **使用工具封装** 通过Launch4j、Exe4j等工具将JAR转换为EXE文件,隐藏内部文件结构。 --- ### 示例操作流程 1. **加密配置示例** ```shell java -jar classfinal-fatjar-1.2.1.jar -file your-app.jar -cfg classfinal.yml -pwd 123456 ``` 2. **检查加密结果** ```shell unzip -l encrypted-app.jar # 查看是否含.java文件 jd-gui encrypted-app.jar # 验证.class文件是否加密 ``` ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值