Java源码混淆,jar包加密,禁止反编译jar包

简介: 本文中介绍使用 XJar 对jar包进行加密。

🍀对jar包加密

使用 XJar 对jar包进行加密。GitHub: https://github.com/core-lib/xjar

Spring Boot JAR 安全加密运行工具, 同时支持的原生JAR

基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动, 动态解密运行的方案, 避免源码泄露以及反编译

功能特性

  1. 无代码侵入, 只需要把编译好的JAR包通过工具加密即可.
  2. 完全内存解密, 降低源码以及字节码泄露或反编译的风险.
  3. 支持所有JDK内置加解密算法.
  4. 可选择需要加解密的字节码或其他资源文件.
  5. 支持Maven插件, 加密更加便捷.
  6. 动态生成Go启动器, 保护密码不泄露.

🍀使用步骤

☘️maven加载依赖包xjar

需要先设置jitpack.io的仓库地址,不然可能下载不了依赖包

在 pom.xml 合适位置加入以下代码

    <!-- 设置 jitpack.io 仓库 -->
    <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>
    <!-- 添加 XJar 依赖 -->
    <dependencies>
        <dependency>
            <groupId>com.github.core-lib</groupId>
            <artifactId>xjar</artifactId>
            <version>4.0.2</version>
            <!-- 如果使用 JUnit 测试类来运行加密可以将 XJar 依赖的 scope 设置为 test. -->
            <!-- <scope>test</scope> -->
        </dependency>
    </dependencies>

☘️加密Demo

import io.xjar.XCryptos;

/**
 * @author ber
 * @version 1.0
 * @date 22/3/11 20:39
 */
public class Encrypt {
    public static void main(String[] args) throws Exception {
        XCryptos.encryption()
                .from("/path/to/read/plaintext.jar")
                .use("password")
                .include("/io/xjar/**/*.class")
                .include("/mapper/**/*Mapper.xml")
                .exclude("/static/**/*")
                .exclude("/conf/*")
                .to("/path/to/save/encrypted.jar");
    }
}

其中/path/to/read/ 待加密jar包路径, password加密密码, /path/to/save/加密后jar包输出路径。
include()方法将需要加密的class文件通过正则匹配的方式加入。

加密后会产生encrypted.jarxjar.goxjar_agentable.go三个文件。
其中encrypted.jar是加密后的jar包。xjar.go是Go启动器源码文件,后面编译时需要用到。

具体方法详细介绍

方法名称 参数列表 是否必选 方法说明
from (String jar) 二选一 指定待加密JAR包路径
from (File jar) 指定待加密JAR包文件
use (String password) 二选一 指定加密密码
use (String algorithm, int keysize, int ivsize, String password) 指定加密算法及加密密码
include (String ant) 可多次调用 指定要加密的资源相对于classpath的ANT路径表达式
include (Pattern regex) 可多次调用 指定要加密的资源相对于classpath的正则路径表达式
exclude (String ant) 可多次调用 指定不加密的资源相对于classpath的ANT路径表达式
exclude (Pattern regex) 可多次调用 指定不加密的资源相对于classpath的正则路径表达式
to (String xJar) 二选一 指定加密后JAR包输出路径, 并执行加密.
to (File xJar) 指定加密后JAR包输出文件, 并执行加密.
  • 指定加密算法的时候密钥长度以及向量长度必须在算法可支持范围内, 具体加密算法的密钥及向量长度请自行百度或谷歌
  • include 和 exclude 同时使用时即加密在include的范围内且排除了exclude的资源

☘️编译运行脚本

编译环境下需要安装GoLang环境,而在运行环境下不需要安装。
在不同平台下编译会得到不同平台的启动器。Windows下编译的启动器不能在linux下使用

go build xjar.go
  • xjar.go前面有说过,是Go启动器源码文件.
  • 将 xjar.go 在不同的平台进行编译即可得到不同平台的启动器可执行文件, 其中Windows下文件名为 xjar.exe 而Linux下为 xjar(再次说)
  • 由于启动器自带JAR包防篡改校验, 故启动器无法通用, 即便密码相同也不行(强调)

☘️启动加密的jar包

/path/to/xjar /path/to/java [OPTIONS] -jar /path/to/encrypted.jar [ARGS]

/path/to/xjar /path/to/javaw [OPTIONS] -jar /path/to/encrypted.jar [ARGS]

nohup /path/to/xjar /path/to/java [OPTIONS] -jar /path/to/encrypted.jar [ARGS]
  • 在 Java 启动命令前加上编译好的Go启动器可执行文件名(xjar)即可启动运行加密后的JAR包.
  • 若使用 nohup 方式启动则 nohup 要放在Go启动器可执行文件名(xjar)之前.
  • 若Go启动器可执行文件名(xjar)不在当前命令行所在目录则要通过绝对路径或相对路径指定.
  • 仅支持通过 -jar 方式启动, 不支持-cp或-classpath的方式.
  • -jar 后面必须紧跟着启动的加密jar文件路径
  • 例子: 如果当前命令行就在 xjar 所在目录, java 环境变量也设置好了 ./xjar java -Xms256m -Xmx1024m -jar /path/to/encrypted.jar

☘️加密后反编译jar包效果

在这里插入图片描述

待补充插件方式生成加密jar包, Github:xjar-maven-plugin

目录
相关文章
|
5天前
|
运维 Java
Java版HIS系统 云HIS系统 云HIS源码 结构简洁、代码规范易阅读
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。
27 5
|
1天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
1天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
1天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
1天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
1天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
8 1
|
5天前
|
JavaScript Java 测试技术
基于Java的电影评论系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的电影评论系统的设计与实现(源码+lw+部署文档+讲解等)
21 0
|
5天前
|
JavaScript Java 测试技术
基于Java的在线日语培训平台的设计与实现(源码+lw+部署文档+讲解等)
基于Java的在线日语培训平台的设计与实现(源码+lw+部署文档+讲解等)
23 0
|
5天前
|
JavaScript Java 测试技术
基于Java的同城蔬菜配送管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的同城蔬菜配送管理系统的设计与实现(源码+lw+部署文档+讲解等)
11 0
|
5天前
|
JavaScript Java 测试技术
基于Java的心理预约咨询管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的心理预约咨询管理系统的设计与实现(源码+lw+部署文档+讲解等)
22 0
基于Java的心理预约咨询管理系统的设计与实现(源码+lw+部署文档+讲解等)