我是小丁,一名小小程序员。
今天给大家介绍一种更为简便的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 环境变量中密码的名字
ENDClassFinal使用场景分析:如果客户只需要你提供源码(一般是jar包),不要求这个jar包能可运行或者功能全部可用,可以将核心代码进行加密(例如核心算法等),然后提供给客户。
如果在客户的私有化环境部署,因为有命令执行记录或者执行脚本,客户一般都能获取到password信息和code信息,很容易就进行逆向工程破解了。
所以ClassFinal只是作为一个基础的Java源码保护工具,你不能对它抱有过高的期望。如果项目代码不太敏感,只是想做个基础的保护,这种方案是可行的。