首页 > 编程语言 >Java class 文件安全加密工具对比+ClassFinal实战

Java class 文件安全加密工具对比+ClassFinal实战

时间:2024-11-28 20:15:08浏览次数:5  
标签:反编译 插件 加密 jar Java ClassFinal class

前言

常见加密方案对比
    XJar
    ProGuard
    ClassFinal

ClassFinal实战
    纯命令方式
    maven插件方式

最后

前言

相信不少的同学开发的软件都是用户商业化,对于这些商业运营的项目很多都会直接部署在客户方,这样就可能会导致项目源码泄露。当然,作为Java语言的搬砖人打的jar包更是如此,可以直接通过GUI反编译轻而易举拿到源码。那么,有没有对我们class文件加密和代码混淆的实战方案呢?答案当然是有的,今天我们就分享一下常规的加密方案。

常见加密方案对比

XJar

Spring Boot JAR 安全加密运行工具,同时支持的原生JAR。
基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动,动态解密运行的方案,避免源码泄露或反编译
功能特性

无需侵入代码,只需要把编译好的JAR包通过工具加密即可。

完全内存解密,杜绝源码以及字节码泄露或反编译。
支持所有JDK内置加解密算法。
可选择需要加解密的字节码或其他资源文件,避免计算资源浪费。

运行环境
新版XJar只支持go启动器模式启动加密后的jar包 , 加密后需要go环境生成go启动器 . 运行时不需要go环境。

加密原理
对jar的字节码加密 , 启动jar包时调用自定义的类加载器, 重写findClass方法,拿到字节流后,先解密再调用Classloader的defineClass方法,初始化成Class对象。

加密结果
加密后的Class不能反编译。

ProGuard

ProGuard 是一个免费的 Java 类文件的压缩,优化,混淆器。它删除没有用的类,字段,方法与属性。使字节码最大程度地优化,使用简短且无意义的名字来重命名类、字段和方法 。

功能特性
1、压缩(shrink) 移除未使用的类、方法、字段等;
2、优化(optimize)优化字节码、简化代码等操作;
3、混淆(obfuscate)使用简短的、无意义的名称全名类名、方法名、字段等;
4、预校验(preverify)为class添加预校验信息。

运行环境
jdk,不需要额外运行环境。

加密结果
混淆后的class反编译后都是一些魔法命名字符,增加阅读难度。

ClassFinal

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

项目模块说明

1、classfinal-core: ClassFinalde 的核心模块,几乎所有加密的代码都在这里;

2、classfinal-fatjar: ClassFinal 打包成独立运行的 jar 包;

3、classfinal-maven-plugin: ClassFinal 加密的 maven 插件;

功能特性:

1、无需修改原项目代码,只要把编译好的 jar/war 包用本工具加密即可。

2、运行加密项目时,无需求修改 tomcat,spring 等源代码。

3、支持普通 jar 包、springboot jar 包以及普通 java web 项目编译的 war 包。

4、支持 spring framework、swagger 等需要在启动过程中扫描注解或生成字节码的框架。

5、支持 maven 插件,添加插件后在打包过程中自动加密。

6、支持加密 WEB-INF/lib 或 BOOT-INF/lib 下的依赖 jar 包。

环境依赖

JDK 1.8 +

本工具使用 AES 算法加密 class 文件,密码是保证不被破解的关键,请保存好密码,请勿泄漏。
密码一旦忘记,项目不可启动且无法恢复,请牢记密码。
本工具加密后,原始的 class 文件并不会完全被加密,只是方法体被清空,保留方法参数、注解等信息,这是为了兼容 spring,swagger 等扫描注解的框架;方法体被清空后,反编译者只能看到方法名和注解,看不到方法的具体内容;当 class 被 classloader 加载时,真正的方法体会被解密注入。

加密结果
配置文件反编译后为空

class文件反编译后直接隐藏方法体

ClassFinal实战

由于我们不希望引入其他外部依赖环境,遂选择ClassFinal进行代码混淆,可以达到隐藏配置文件内容和清空方法体的效果,即使外部人员拿到源码也不能仿造系统。
纯命令方式

下载工具

https://repo1.maven.org/maven2/net/roseboy/classfinal-fatjar/1.2.1/classfinal-fatjar-1.2.1.jar

参数说明

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

执行以下命令

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

结果: 生成 yourpaoject-encrypted.jar,这个就是加密后的jar文件;加密后的文件不可直接执行,需要配置javaagent。

执行jar

java -javaagent:yourpaoject-encrypted.jar='-pwd 123456' -jar yourpaoject-encrypted.jar

maven插件方式

引入ClassFinal插件后直接package即可生成加密包

pom引入插件:

<plugin>
    <groupId>net.roseboy</groupId>
    <artifactId>classfinal-maven-plugin</artifactId>
    <version>1.2.1</version>
    <configuration>
        <password>#</password>
        <packages>yourpackage</packages>
        <excludes>org.spring</excludes>
        <cfgfiles>yourconfig</cfgfiles>
        <libjars>yourjar</libjars>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>classFinal</goal>
            </goals>
        </execution>
    </executions>
</plugin>

mvn打包:

mvn package -Dmaven.test.skip=true

反编译jar

配置文件全部清空

class文件方法体全部清空

依赖的lib包方法体全部清空

最后

非常重要的项目推荐使用XJar可以完全隐藏Class文件内容,但是需要额外的go环境支持,也可以保守选择ClassFinal直接无侵入达到隐藏方法体和配置文件内容的目的。当然任何的加密和代码混淆的方案都只是增加反编译破解难度,在实际的生产中还需要增加远程鉴权、机器码植入验证、远程依赖加载等等方式保证软件的控制权。

原创 senfel 架构集结号

标签:反编译,插件,加密,jar,Java,ClassFinal,class
From: https://www.cnblogs.com/o-O-oO/p/18575037

相关文章

  • Paper Reading: Relating instance hardness to classifcation performance in a d
    目录研究动机文章贡献实例空间分析ISA框架实例空间构造足迹分析单个数据集的ISA硬度度量指标算法和性能评估特征选择实例空间表示和足迹实验结果案例研究:对于COVIDprognosis数据集的ISA分析案例研究:使用ISA检测COMPAS数据集算法偏差案例分析:使用ISA分析标签噪声数据......
  • Java 编程的经典反例及其事故分析
    Java编程的经典反例及其事故分析Java作为一种广泛使用的编程语言,凭借其稳定性和可移植性在众多领域中占据了重要地位。然而,即便是最强大的语言,也会因为不良的编程习惯而导致严重的事故。本文将列举几个经典的Java编程反例,并分析这些反例背后的原因及其可能带来的影响......
  • [2096]基于JAVA的混凝土供应链智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的混凝土供应链智慧管理系统的设计与实现指导老师(一)选题的背景和意义背景部分:在当今信息化高速发展的时代背景下,随着我国基础设施建设规模不断扩大,混凝土作为建筑行业不可或缺的基础材料,其供应链管理面临着巨大的......
  • [2093]基于JAVA的涉诉资产智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的涉诉资产智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景:随着我国法治建设的不断深入和司法体系的日益完善,涉诉资产作为诉讼活动中的重要组成部分,其管理效率与公正性直接影响着司法工作的质量和效......
  • 揭秘Java反射的神秘面纱:Method.invoke方法,让你的代码更灵活!
    Java反射机制允许程序在运行时动态地访问和操作类的属性和方法。Method类的invoke方法是反射API中一个非常强大的工具,它可以用来调用任何对象的任意方法,包括私有方法。基本用法Method.invoke(Objectobj,Object...args)方法用于调用对象obj上的方法。其中,args是传递给......
  • 【Java 操作共享文件夹,SmbFile类让你轻松实现!】
    在Java中,通过使用SmbFile类可以方便地操作共享文件夹。SmbFile是JCIFS(JavaCIFSClientLibrary)库的一部分,用于访问基于SMB/CIFS协议的共享文件和打印机。以下是如何使用SmbFile类来操作共享文件夹的详细步骤和代码示例:1.添加JCIFS依赖首先,你需要在你的项目中添加JCI......
  • JAVA之多线程
    什么是线程?线程(Thread)是一个程序内部的一条执行流程。什么是多线程?多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)如何创建多线程:有两种方法可以创建新的执行线程。一种是将类声明为Thread的子类。此子类应覆盖类Thread的run方法。然后可......
  • 深入理解 Java 虚拟机-第一部分 走进 Java 笔记
    Sun/Oracle公司研发的热门虚拟机有三个:ClassicVM/ExactVM/HotSpotVMClassicVM:基于句柄(Handle)的对象查找方式,需要外挂JITExactVM:优于ClassicVM,使用了准确式内存管理(记录内存中存储的类型是地址还是数值),丢弃句柄,内置JIT,支持热点代码探测(通过计数器找出有......
  • java实现多线程读,单线程写
    多线程读,单线程写excel通过工厂模式,队列实现多线程读取(可以是文件,也可以是数据库),单线程向excel文件写;实现了一个线程出现问题其他线程同步中断。该实现逻辑的同时可以防止oom。  privatestaticfinalintINITIAL_CAPACITY=10;  privatestaticfinalintMAX_CA......
  • java 多线程同步方法CyclicBarrier/CountDownLatch/AtomicBoolean/Semaphore
    CyclicBarrier 有两个构造函数,CyclicBarrier(int),CyclicBarrier(int,Runnable)目的:通过输入任务数实现线程同步; 使用场景: 多线程计算:当多个线程需要分阶段并行处理数据,但在每一阶段结束时需要所有线程同步,以便开始下一阶段的处理。 并行任务协调:例如,在并行搜索或并行数......