Java代码保护方法之二:ClassFinal

老丁谈职场 2025-02-01 12:09:11

我是小丁,一名小小程序员。

今天给大家介绍一种更为简便的Java代码保护工具:ClassFinal。

开源+配置项少+使用简便,成为它的亮点。不像上篇文章介绍的ProGuard,配置项很多,而且稍不注意还会出错。ClassFinal只需要少量的配置,就可以达到不错的保护效果。

ClassFinal是一款Java文件安全加密工具,主要功能是保护Java类文件,可避免源码泄漏或字节码直接被反编译。

为啥要带“直接”这个字眼呢?因为通过反向工程,还是可以反编译的,这种保护方式太弱了。

原理是使用提供的加密程序,先对jar/war包进行加密,然后使用java-agent技术,在main程序执行之前,执行pre-main,对加密的class文件进行解密。

优点和不足

优点:

不足:

因为ClassFinal是开源的,保护的原理和过程很容易通过源码获取。

如果竞争对手蓄意购买你的一套软件,私有化部署在它自己的服务器,知道了密码的情况下,很容易就通过逆向工程来破解,获得加密前的源码。

具体使用过程

模块说明:

环境依赖:

JDK 1.8 +

maven 3.9.3

使用方式:

1、指令方式:

java -jarfinal-fatjar.jar -file yourpaoject.jar -libjars a.jar,b.jar -packages com.yourpackage,com.yourpackage2 -exclude com.yourpackage.Main -pwd 123456 -Y

2、maven插件方式

在要加密的项目pom.xml中加入以下插件配置,目前最新版本是:1.2.1。

<plugin><!--https://gitee.com/roseboy/classfinal --><groupId>net.roseboy</groupId><artifactId>classfinal-maven-plugin</artifactId><version>1.2.1</version><configuration><!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码--><password>000000</password><packages>com.dxc.project2</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>

3、password和code

如果需要设置code,需要先在需要部署的服务器执行:

java -jarfinal-fatjar.jar -C

拿到这个服务器的code,然后复制到maven配置上

此时的maven插件配置:

生成的加密后的jar包为:

加密后的数据会存放在jar包的META-INF/.classes 目录下:

com.dxc.project2.Student文件加密后的文件

org.springframework.config.Code 是code md5后的值存储文件,运行的时候会获取当前机器的code,进行md5后和这个值进行校验

org.springframework.config.PassHash 是password md5+salt后的值存储文件,运行的时候会校验

机器码生成算法:

mac+cpu序列号+硬盘序列号

加密前后的class文件对比:

运行:

java -javaagent:yourpaoject-encrypted.jar='-pwd 0000000' -jar yourpaoject-encrypted.jar//参数说明// -pwd      加密项目的密码  // -pwdname  环境变量中密码的名字

END

ClassFinal使用场景分析:如果客户只需要你提供源码(一般是jar包),不要求这个jar包能可运行或者功能全部可用,可以将核心代码进行加密(例如核心算法等),然后提供给客户。

如果在客户的私有化环境部署,因为有命令执行记录或者执行脚本,客户一般都能获取到password信息和code信息,很容易就进行逆向工程破解了。

所以ClassFinal只是作为一个基础的Java源码保护工具,你不能对它抱有过高的期望。如果项目代码不太敏感,只是想做个基础的保护,这种方案是可行的。

0 阅读:0