GitHub: https://github.com/core-lib/xjar

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

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

功能特性

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

完全内存解密, 降低源码以及字节码泄露或反编译的风险.

支持所有JDK内置加解密算法.

可选择需要加解密的字节码或其他资源文件.

支持Maven插件, 加密更加便捷.

动态生成Go启动器, 保护密码不泄露.

使用步骤

1. 添加依赖

jitpack.io

https://jitpack.io

com.github.core-lib

xjar

4.0.1

必须添加 https://jitpack.io Maven仓库.

如果使用 JUnit 测试类来运行加密可以将 XJar 依赖的 scope 设置为 test.

2. 加密源码

XCryptos.encryption()

.from("/path/to/read/plaintext.jar")

.use("io.xjar")

.include("/io/xjar/**/*.class")

.include("/mapper/**/*Mapper.xml")

.exclude("/static/**/*")

.exclude("/conf/*")

.to("/path/to/save/encrypted.jar");

方法名称

参数列表

是否必选

方法说明

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的资源.

3. 编译脚本

安装go语言环境下载地址:https://studygolang.com/dl

go build xjar.go

通过步骤2加密成功后XJar会在输出的JAR包同目录下生成一个名为 xjar.go 的的Go启动器源码文件.

将 xjar.go 在不同的平台进行编译即可得到不同平台的启动器可执行文件, 其中Windows下文件名为 xjar.exe 而Linux下为 xjar.

用于编译的机器需要安装 Go 环境, 用于运行的机器则可不必安装 Go 环境, 具体安装教程请自行搜索.

由于启动器自带JAR包防篡改校验, 故启动器无法通用, 即便密码相同也不行.

4. 启动运行

xjar java -jar /path/to/encrypted.jar

xjar javaw -jar /path/to/encrypted.jar

nohup xjar java -jar /path/to/encrypted.jar

在 Java 启动命令前加上编译好的Go启动器可执行文件名(xjar)即可启动运行加密后的JAR包.

若使用 nohup 方式启动则 nohup 要放在Go启动器可执行文件名(xjar)之前.

若Go启动器可执行文件名(xjar)不在当前命令行所在目录则要通过绝对路径或相对路径指定.

仅支持通过 -jar 方式启动, 不支持-cp或-classpath的方式.

注意事项

1. 不兼容 spring-boot-maven-plugin 的 executable = true 以及 embeddedLaunchScript

org.springframework.boot

spring-boot-maven-plugin

2. Spring Boot + JPA(Hibernate) 启动报错问题

如果项目中使用了 JPA 且实现为Hibernate时, 由于Hibernate自己解析加密后的Jar文件, 所以无法正常启动, 可以采用以下解决方案:

clone XJar-Agent-Hibernate , 使用 mvn clean package 编译出 xjar-agent-hibernate-${version}.jar 文件

采用 xjar java -javaagent:xjar-agent-hibernate-${version}.jar -jar your-spring-boot-app.jar 命令启动

3. 静态文件浏览器无法加载完成问题

由于静态文件被加密后文件体积变大, Spring Boot 会采用文件的大小作为 Content-Length 头返回给浏览器, 但实际上通过 XJar 加载解密后文件大小恢复了原本的大小, 所以浏览器认为还没接收完导致一直等待服务端. 由此我们需要在加密时忽略静态文件的加密, 实际上静态文件也没加密的必要, 因为即便加密了用户在浏览器 查看源代码也是能看到完整的源码.通常情况下静态文件都会放在 static/ 和 META-INF/resources/ 目录下, 我们只需要在加密时通过 exclude 方法排除这些资源即可, 可以参考以下例子:

XCryptos.encryption()

.from("/path/to/read/plaintext.jar")

.use("io.xjar")

.exclude("/static/**/*")

.exclude("/META-INF/resources/**/*")

.to("/path/to/save/encrypted.jar");

4. JDK-9及以上版本由于模块化导致XJar无法使用 jdk.internal.loader 包的问题解决方案

在启动时添加参数 --add-opens java.base/jdk.internal.loader=ALL-UNNAMED

xjar java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED -jar /path/to/encrypted.jar

5. 由于使用了阿里云Maven镜像导致无法从 jitpack.io 下载 XJar 依赖的问题

参考如下设置, 在镜像配置的 mirrorOf 元素中加入 ,!jitpack.io 结尾.

alimaven

central,!jitpack.io

aliyun maven

http://maven.aliyun.com/nexus/content/repositories/central/

插件集成

Maven项目可通过集成 xjar-maven-plugin 以免去每次加密都要执行一次上述的代码, 随着Maven构建自动生成加密后的JAR和Go启动器源码文件.

xjar-maven-plugin GitHub: https://github.com/core-lib/xjar-maven-plugin

jitpack.io

https://jitpack.io

com.github.core-lib

xjar-maven-plugin

4.0.1

build

package

io.xjar

对于Spring Boot 项目或模块, 该插件要后于 spring-boot-maven-plugin 插件执行, 有两种方式:

将插件放置于 spring-boot-maven-plugin 的后面, 因为其插件的默认 phase 也是 package

将插件的 phase 设置为 install(默认值为:package), 打包命令采用 mvn clean install

也可以通过Maven命令执行

mvn xjar:build -Dxjar.password=io.xjar

mvn xjar:build -Dxjar.password=io.xjar -Dxjar.targetDir=/directory/to/save/target.xjar

但通常情况下是让XJar插件绑定到指定的phase中自动执行, 这样就能在项目构建的时候自动构建出加密的包.

mvn clean package -Dxjar.password=io.xjar

mvn clean install -Dxjar.password=io.xjar -Dxjar.targetDir=/directory/to/save/target.xjar

强烈建议

强烈建议不要在 pom.xml 的 xjar-maven-plugin 配置中写上密码,这样会导致打包出来的 xjar 包中的 pom.xml 文件保留着密码,极其容易暴露密码!强烈推荐通过 mvn 命令来指定加密密钥!

参数说明

参数名称

命令参数名称

参数说明

参数类型

缺省值

示例值

password

-Dxjar.password

密码字符串

String

必须

任意字符串, io.xjar

algorithm

-Dxjar.algorithm

加密算法名称

String

AES/CBC/PKCS5Padding

JDK内置加密算法, 如:AES/CBC/PKCS5Padding 和 DES/CBC/PKCS5Padding

keySize

-Dxjar.keySize

密钥长度

int

128

根据加密算法而定, 56, 128, 256

ivSize

-Dxjar.ivSize

密钥向量长度

int

128

根据加密算法而定, 128

sourceDir

-Dxjar.sourceDir

源jar所在目录

File

${project.build.directory}

文件目录

sourceJar

-Dxjar.sourceJar

源jar名称

String

${project.build.finalName}.jar

文件名称

targetDir

-Dxjar.targetDir

目标jar存放目录

File

${project.build.directory}

文件目录

targetJar

-Dxjar.targetJar

目标jar名称

String

${project.build.finalName}.xjar

文件名称

includes

-Dxjar.includes

需要加密的资源路径表达式

String[]

io/xjar/** , mapper/*Mapper.xml , 支持Ant表达式

excludes

-Dxjar.excludes

无需加密的资源路径表达式

String[]

static/** , META-INF/resources/** , 支持Ant表达式

指定加密算法的时候密钥长度以及向量长度必须在算法可支持范围内, 具体加密算法的密钥及向量长度请自行百度或谷歌.

当 includes 和 excludes 同时使用时即加密在includes的范围内且排除了excludes的资源.

tomcat xjar 加密_XJar Spring Boot JAR 安全加密运行工具相关推荐

  1. Spring boot Jar和war运行差异

    2019独角兽企业重金招聘Python工程师标准>>> spring boot 2.0.1 版本 目前发现jar包运行和war包运行的差异记录下来 路径.似乎war对路径要求更严格, ...

  2. 硬核艿艿,新鲜出炉,直接带你弄懂 Spring Boot Jar 启动原理!

    " 摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/jar/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1. 概述 2. MANIFEST.MF 3. J ...

  3. 学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密

    学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密 技术标签: RSA  AES  RSA AES  混合加密  整合 前言:    为了提高安全性采用了RSA,但 ...

  4. Spring Boot 配置文件密码加密方法

    参考:https://github.com/ulisesbocchio/jasypt-spring-boot Spring Boot 配置文件密码加密两种方案 - ken007 - 博客园 1.引入j ...

  5. Spring Boot jar 启动时设置环境参数

    文章目录 1 摘要 2 核心代码 2.1 spring Boot 多环境配置 2.2 spring Boot 项目启动命令 3 Spring boot 简易启动与停止 shell 脚本 3.1 启动脚 ...

  6. apache目录 vscode_VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)

    VsCode搭建Java开发环境(Spring Boot项目创建.运行.调试) 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.springboot等所需要的扩展. 开 ...

  7. VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)

    本文转载自:https://www.cnblogs.com/miskis/p/9816135.html 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.springbo ...

  8. Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue

    Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue 一.Neo4j 二.Neo4j客户端浏览器 三.maven依赖 四.节点/关系映射 1.NodePer ...

  9. Java工作笔记-Spring boot中配置文件加密(Jasypt的使用)

    Jasypt Spring Boot提供了Spring Boot应用程序配置文件的加密.有下面3种方式在项目中集成jasypt-spring-boot: 1. 在classpath中添加jasypt- ...

最新文章

  1. AI换脸技术再创新高度,DeepMind发布的VQ-VAE二代算法有多厉害?
  2. Microbiome:空间尺度对华北平原麦田土壤细菌群落的影响(南土所褚海燕组)
  3. 第十周项目3-血型统计
  4. pytorch基础知识整理(三)模型保存与加载
  5. css --- 行内框和内容区
  6. ETL异构数据源Datax_datax-web安装部署_10
  7. 初探EntityFramework——实体类结构映射
  8. Git clone的使用方法
  9. 案例:使用正则表达式的爬虫
  10. 例子---PHP与Form表单前导篇
  11. c语言中数组结尾的0的作用,C语言里面一个数组最后的\0表示什么意思?
  12. mxnet系列 安装
  13. C盘哪些文件可以删除?windows7瘦身攻略
  14. 好看的头像太多了,全部拿住!
  15. No fallback instance of type class错误的解决方案
  16. vue3的setup的使用和原理解析
  17. 2020年是意义非凡的一年,大专的我面试阿里P6居然过了,activity事件分发
  18. MBA-day20 不定方程问题-练习题
  19. 腾讯设计师是这么理解和运用的设计规范的
  20. Alexa网站排名爬取

热门文章

  1. 第一轮返工潮,哪些城市疫情传播压力最大
  2. Counter 用法 from collections import Counter
  3. 2016计算机视觉应用专题研究报告
  4. visio网络拓扑图_人才测评模型是什么?5步了解好看模型图
  5. Python一亿以内的素数个数_Python 计数质数
  6. 宁德时代,想成为“绿巨人”
  7. 马斯克证实:特斯拉将加大在中国的投资和研发力度
  8. 蓝色起源8月25日进行无人飞行,携带实验设备等上天
  9. 多益网络与咪咕音乐携手音乐共创 李荣浩领衔唱响神武之夜
  10. 字节跳动入局外卖赛道 美团饿了么怕了吗?