XJar:Spring-BootJAR包加解密工具,避免源码泄露以及反编译。

XJar:Spring-BootJAR包加解密工具,避免源码泄露以及反编译。

2023年7月13日发(作者:)

XJar:Spring-BootJAR包加解密⼯具,避免源码泄露以及反编译。XJarSpring Boot JAR 安全加密运⾏⼯具,同时⽀持的原⽣JAR。基于对JAR包内资源的加密以及拓展ClassLoader来构建的⼀套程序加密启动,动态解密运⾏的⽅案,避免源码泄露或反编译。功能特性⽆需侵⼊代码,只需要把编译好的JAR包通过⼯具加密即可。完全内存解密,杜绝源码以及字节码泄露或反编译。⽀持所有JDK内置加解密算法。可选择需要加解密的字节码或其他资源⽂件,避免计算资源浪费。环境依赖JDK 1.7 +使⽤步骤 -lib xjar v2.0.6 // Spring-Boot Jar包加密String password = "";XKey xKey = (password);t("/path/to/read/", "/path/to/save/", xKey);// 危险加密模式,即不需要输⼊密码即可启动的加密⽅式,这种⽅式META-INF/中会保留密钥,请谨慎使⽤!String password = "";XKey xKey = (password);t("/path/to/read/", "/path/to/save/", xKey, _DANGER);// Spring-Boot Jar包解密String password = "";XKey xKey = (password);t("/path/to/read/", "/path/to/save/", xKey);// Jar包加密String password = "";XKey xKey = (password);t("/path/to/read/", "/path/to/save/", xKey);// 危险加密模式,即不需要输⼊密码即可启动的加密⽅式,这种⽅式META-INF/中会保留密钥,请谨慎使⽤!String password = "";XKey xKey = (password);t("/path/to/read/", "/path/to/save/", xKey, _DANGER);// Jar包解密String password = "";XKey xKey = (password);t("/path/to/read/", "/path/to/save/", xKey);启动命令// 命令⾏运⾏JAR 然后在提⽰输⼊密码的时候输⼊密码后按回车即可正常启动java -jar /path/to/// 也可以通过传参的⽅式直接启动,不太推荐这种⽅式,因为泄露的可能性更⼤!java -jar /path/to/ --rd=PASSWORD// 对于 nohup 或 javaw 这种后台启动⽅式,⽆法使⽤控制台来输⼊密码,推荐使⽤指定密钥⽂件的⽅式启动nohup java -jar /path/to/ --e=/path/to/参数说明参数名称--e参数含义密码密钥算法密钥长度向量长度密钥⽂件AES128128./⽀持JDK所有内置算法,如AES / DES ...根据不同的算法选取不同的密钥长度。根据不同的算法选取不同的向量长度。密钥⽂件相对或绝对路径。缺省值说明密钥⽂件密钥⽂件采⽤properties的书写格式:password: PASSWORDalgorithm: ALGORITHMkeysize: KEYSIZEivsize: IVSIZEhold: HOLD其中 algorithm/keysize/ivsize/hold 均有缺省值,当 hold 值不为 true | 1 | yes | y 时,密钥⽂件在读取后将⾃动删除。参数名称passwordalgorithmkeysizeivsizehold参数含义密码密钥算法密钥长度向量长度是否保留缺省值⽆AES128128false说明密码字符串⽀持JDK所有内置算法,如AES / DES ...根据不同的算法选取不同的密钥长度。根据不同的算法选取不同的向量长度。读取后是否保留密钥⽂件。进阶⽤法默认情况下,即没有提供过滤器的时候,将会加密所有资源其中也包括项⽬其他依赖模块以及第三⽅依赖的 JAR 包资源,框架提供使⽤过滤器的⽅式来灵活指定需要加密的资源或排除不需要加密的资源。硬编码⽅式// 假如项⽬所有类的包名都以 t 开头,那只加密⾃⾝项⽬的字节码即可采⽤以下⽅式。t( "/path/to/read/",

"/path/to/save/",

"",

(entry) -> { String name = e(); String pkg = "com/company/project/"; return With(pkg); } );表达式⽅式// 1. 采⽤Ant表达式过滤器更简洁地来指定需要加密的资源。t(plaintext, encrypted, password, new XJarAntEntryFilter("com/company/project/**"));t(plaintext, encrypted, password, new XJarAntEntryFilter("mapper/*"));t(plaintext, encrypted, password, new XJarAntEntryFilter("com/company/project/**/*"));// 2. 采⽤更精确的正则表达式过滤器。t(plaintext, encrypted, password, new XJarRegexEntryFilter("com/company/project/(.+)"));t(plaintext, encrypted, password, new XJarRegexEntryFilter("mapper/(.+)"));t(plaintext, encrypted, password, new XJarRegexEntryFilter("com/company/project/(.+)/(.+)"));混合⽅式当过滤器的逻辑复杂或条件较多时可以将过滤器分成多个,并且使⽤ XKit ⼯具类提供的多个过滤器混合⽅法混合成⼀个,XKit 提供 “与”“或” “⾮” 三种逻辑运算的混合。// 1. 与运算,即所有过滤器都满⾜的情况下才满⾜,mix() ⽅法返回的是this,可以继续拼接。XEntryFilter and = () .mix(new XJarAntEntryFilter("com/company/project/**")) .mix(new XJarAntEntryFilter("*/**.class"));XEntryFilter all = () .mix(new XJarAntEntryFilter("com/company/project/**")) .mix(new XJarAntEntryFilter("*/**.class"));// 2. 或运算,即任意⼀个过滤器满⾜的情况下就满⾜,mix() ⽅法返回的是this,可以继续拼接。XEntryFilter or = () .mix(new XJarAntEntryFilter("com/company/project/**")) .mix(new XJarAntEntryFilter("mapper/*"));XEntryFilter any = () .mix(new XJarAntEntryFilter("com/company/project/**")) .mix(new XJarAntEntryFilter("mapper/*"));// 3. ⾮运算,即除此之外都满⾜,该例⼦中即排除项⽬或其他模块和第三⽅依赖jar中的静态⽂件。XEntryFilter not = ( () .mix(new XJarAntEntryFilter("static/**")) .mix(new XJarAntEntryFilter("META-INF/resources/**")));注意事项 spring-boot-maven-plugin Spring Boot + JPA(Hibernate) 问题如果项⽬中使⽤了 JPA 且实现为Hibernate时,由于Hibernate⾃⼰解析加密后的Jar⽂件,所以⽆法正常启动,可以采⽤以下解决⽅案1. clone XJar-Agent-Hibernate ,使⽤ mvn clean package 编译出 xjar-agent-hibernate-${version}.jar ⽂件2. 采⽤ java -javaagent:xjar-agent-hibernate-${version}.jar -jar 命令启动静态⽂件浏览器⽆法加载完成问题由于静态⽂件被加密后⽂件体积变⼤,Spring Boot 会采⽤⽂件的⼤⼩作为 Content-Length 头返回给浏览器,但实际上通过 XJar 加载解密后⽂件⼤⼩恢复了原本的⼤⼩,所以浏览器认为还没接收完导致⼀直等待服务端。由此我们需要在加密时忽略静态⽂件的加密,实际上静态⽂件也没加密的必要,因为即便加密了⽤户在浏览器查看源代码也是能看到完整的源码的。通常情况下静态⽂件都会放在 static/ 和 META-INF/resources/ ⽬录下,我们只需要在加密时通过过滤器排除这些资源即可,可以采⽤以下的过滤器:( () .mix(new XJarAntEntryFilter("static/**")) .mix(new XJarAntEntryFilter("META-INF/resources/**")));或通过插件配置排除 -lib xjar-maven-plugin v2.0.6 build package static/** META-INF/resources/** 插件集成对于Spr对于Spring Boing Boot 项⽬或模块,该插件要后于 spring-boot-maven-plugin 插件执⾏,有两种⽅式:将插件放置于 spring-boot-maven-plugin 的后⾯,因为其插件的默认 phase 也是 package将插件的 phase 设置为 install(默认值为:package),打包命令采⽤ mvn clean install -lib xjar-maven-plugin v2.0.6 build package com/company/project/** mapper/* 也可以通过Maven命令执⾏mvn xjar:build -rd=n xjar:build -rd= -Dir=/directory/to/save/但通常情况下是让XJar插件绑定到指定的phase中⾃动执⾏,这样就能在项⽬构建的时候⾃动构建出加密的包。mvn clean package -rd=n clean install -rd= -Dir=/directory/to/save/参数说明参数名称password命令参数名称-rd-参数说明参数类型String缺省值⽰例值密码字符串必须任意字符串,gori参数thm名称命令参数rithm名称-es加密算法名称参数说明Strin参数g类型intAES缺省值JDK内置加密算法,如:AES / DES⽰例值密钥长度128根据加密算法⽽定,56,128,256ivSize密钥向量长度int128根据加密算法⽽定,128mode加密模式int00:普通模式 1:危险模式(免密码启动)sourceDir源jar所在⽬录File${ory}⽂件⽬录sourceJar源jar名称String${ame}.jar⽂件名称targetDir⽬标jar存放⽬录File${ory}⽂件⽬录targetJar⽬标jar名称String${ame}.xjar⽂件名称includes需要加密的资源路径表达式String[]⽆com/company/project/** ,mapper/* , ⽀持Ant表达式excludes⽆需加密的资源路径表达式String[]⽆static/** , META-INF/resources/** , ⽀持Ant表达式注意:当 includes 和 excludes 同时使⽤时即加密在includes的范围内且排除了excludes的资源。更多⽂档:XJar-Maven-Plugin版本记录v2.0.61. 解决多jar包启动时⽆法找到准确的导致⽆法正常启动的问题v2.0.51. 升级LoadKit依赖版本2. 修复ANT表达式⽆法正确匹配*/通配符的问题v2.0.41. 解决危险模式不⽀持ubuntu系统的问题v2.0.31. 过滤器泛型协变⽀持2. xjar-maven-plugin ⽀持 includes 与 excludes 同时起效,当同时设置时即加密在includes范围内但⼜不在excludes范围内的资源v2.0.21. 原⽣jar增加密钥⽂件的启动⽅式,解决类似 nohup 和 javaw 的后台启动⽅式⽆法通过控制台输⼊密码的问题v2.0.11. 增加密钥⽂件的启动⽅式,解决类似 nohup 和 javaw 的后台启动⽅式⽆法通过控制台输⼊密码的问题2. 修复解密后没有删除危险模式中在中保留的密钥信息v2.0.01. ⽀持内嵌JAR包资源的过滤加解密2. 不兼容v1.x.x的过滤器表达式,统⼀采⽤相对于 classpath 资源URL的过滤表达式v1.1.41. ⽀持 Spring-Boot 以ZIP⽅式打包,即依赖外部化⽅式启动。2. 修复⽆加密资源时⽆法启动问题v1.1.31. 实现危险模式加密启动,即不需要输⼊密码!2. 修复⽆法使⽤ e(); 时⽤ new Scanner() 替代。v1.1.21. 避免⽤户由于过滤器使⽤不当造成⽆法启动的风险v1.1.11. 修复bugv1.1.01. 整理⽬录结构2. 增加正则表达式/Ant表达式过滤器和“⾮”(!)逻辑运算过滤器3. 将XEntryFilters⼯具类整合在XKit类中4. 缺省过滤器情况下Spring-Boot JAR包加密的资源只限定在 BOOT-INF/classes/ 下v1.0.91. 修复对Spring-Boot 版本依赖的bugv1.0.81. ⽀持以Maven插件⽅式集成v1.0.71. 将sprint-boot-loader依赖设为provide2. 将XEntryFilter#filter(E entry); 变更为XEntryFilter#filtrate(E entry);3. 将Encryptor/Decryptor的构造函数中接收多个过滤器参数变成接收⼀个,外部提供XEntryFilters⼯具类来实现多过滤器混合成⼀个,避免框架⾃⾝的逻辑限制了使⽤者的过滤逻辑实现。v1.0.61. 采⽤LoadKit作为资源加载⼯具v1.0.51. ⽀持并⾏类加载,需要JDK1.7+的⽀持,可提升多线程环境类加载的效率2. Spring-Boot JAR 包加解密增加⼀个安全过滤器,避免⽆关资源被加密造成⽆法运⾏3. XBoot / XJar ⼯具类中增加多个按⽂件路径加解密的⽅法,提升使⽤便捷性v1.0.4 ⼩优化v1.0.3 增加Spring-Boot的FatJar加解密时的缺省过滤器,避免由于没有提供过滤器时加密后的JAR包不能正常运⾏。v1.0.2 修复中⽂及空格路径的问题v1.0.1 升级detector框架v1.0.0 第⼀个正式版发布协议声明Apache-2.0加⼊群聊QQ 950956093image

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689200266a220025.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信