Giter VIP home page Giter VIP logo

xjar's Introduction

XJar

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

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

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

功能特性

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

环境依赖

JDK 1.7 +

使用步骤

1. 添加依赖

<project>
    <!-- 设置 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>
            <!-- <scope>test</scope> -->
        </dependency>
    </dependencies>
</project>
  • 必须添加 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 build xjar.go
  • 通过步骤2加密成功后XJar会在输出的JAR包同目录下生成一个名为 xjar.go 的的Go启动器源码文件.
  • 将 xjar.go 在不同的平台进行编译即可得到不同平台的启动器可执行文件, 其中Windows下文件名为 xjar.exe 而Linux下为 xjar.
  • 用于编译的机器需要安装 Go 环境, 用于运行的机器则可不必安装 Go 环境, 具体安装教程请自行搜索.
  • 由于启动器自带JAR包防篡改校验, 故启动器无法通用, 即便密码相同也不行.

4. 启动运行

/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

注意事项

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

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <!-- 需要将executable和embeddedLaunchScript参数删除, 目前还不能支持对该模式Jar的加密!后面可能会支持该方式的打包. 
    <configuration>
        <executable>true</executable>
        <embeddedLaunchScript>...</embeddedLaunchScript>
    </configuration>
    -->
</plugin>

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

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

  1. clone XJar-Agent-Hibernate , 使用 mvn clean package 编译出 xjar-agent-hibernate-${version}.jar 文件
  2. 采用 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 结尾.

<mirror>
    <id>alimaven</id>
    <mirrorOf>central,!jitpack.io</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

插件集成

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

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

<project>
    <!-- 设置 jitpack.io 插件仓库 -->
    <pluginRepositories>
        <pluginRepository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </pluginRepository>
    </pluginRepositories>
    <!-- 添加 XJar Maven 插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>com.github.core-lib</groupId>
                <artifactId>xjar-maven-plugin</artifactId>
                <version>4.0.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <phase>package</phase>
                        <!-- 或使用
                        <phase>install</phase>
                        -->
                        <configuration>
                            <password>io.xjar</password>
                            <!-- optional
                            <algorithm/>
                            <keySize/>
                            <ivSize/>
                            <includes>
                                <include/>
                            </includes>
                            <excludes>
                                <exclude/>
                            </excludes>
                            <sourceDir/>
                            <sourceJar/>
                            <targetDir/>
                            <targetJar/>
                            -->
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

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

更多文档:xjar-maven-plugin

版本记录

  • 4.0.2
    1. 安全性升级
  • 4.0.1
    1. 兼容JDK-9及以上版本
  • 4.0.0
    1. 加解密支持填充模式
    2. 加解密支持IV-Parameter
    3. 升级启动器
    4. 移除危险模式
    5. 拼写错误修正
    6. 提供智能加密/解密器 避免使用失误
    7. 删除多余的加密/解密方法
    8. 修复有安全校验的nested-lib在不加密其内部资源情况下启动时也无法通过校验的问题
    9. 去除命令启动和手输密码启动的方式只保留Go启动器的模式
    10. 增加可读性更强的Fluent风格的加密/解密API
  • 2.0.9
    1. 修复XJar类加载器加载的类没有 ProtectionDomain 以及 CodeSource 的问题
    2. 去除版本号前置的"v"
  • v2.0.7
    1. 修复不同字符集机器间加密与运行的问题
  • v2.0.6
    1. 解决多jar包启动时无法找到准确的MANIFEST.MF导致无法正常启动的问题
  • v2.0.5
    1. 升级LoadKit依赖版本
    2. 修复ANT表达式无法正确匹配**/*通配符的问题
  • v2.0.4
    1. 解决危险模式不支持ubuntu系统的问题
  • v2.0.3
    1. 过滤器泛型协变支持
    2. xjar-maven-plugin 支持 includes 与 excludes 同时起效, 当同时设置时即加密在includes范围内但又不在excludes范围内的资源
  • v2.0.2
    1. 原生jar增加密钥文件的启动方式, 解决类似 nohup 和 javaw 的后台启动方式无法通过控制台输入密码的问题
  • v2.0.1
    1. 增加密钥文件的启动方式, 解决类似 nohup 和 javaw 的后台启动方式无法通过控制台输入密码的问题
    2. 修复解密后没有删除危险模式中在MANIFEST.MF中保留的密钥信息
  • v2.0.0
    1. 支持内嵌JAR包资源的过滤加解密
    2. 不兼容v1.x.x的过滤器表达式, 统一采用相对于 classpath 资源URL的过滤表达式
  • v1.1.4
    1. 支持 Spring-Boot 以ZIP方式打包, 即依赖外部化方式启动.
    2. 修复无加密资源时无法启动问题
  • v1.1.3
    1. 实现危险模式加密启动, 即不需要输入密码!
    2. 修复无法使用 System.console(); 时用 new Scanner(System.in) 替代.
  • v1.1.2
    1. 避免用户由于过滤器使用不当造成无法启动的风险
  • v1.1.1
    1. 修复bug
  • v1.1.0
    1. 整理目录结构
    2. 增加正则表达式/Ant表达式过滤器和“非”(!)逻辑运算过滤器
    3. 将XEntryFilters工具类整合在XKit类中
    4. 缺省过滤器情况下Spring-Boot JAR包加密的资源只限定在 BOOT-INF/classes/ 下
  • v1.0.9
    1. 修复对Spring-Boot 版本依赖的bug
  • v1.0.8
    1. 支持以Maven插件方式集成
  • v1.0.7
    1. 将sprint-boot-loader依赖设为provide
    2. 将XEntryFilter#filter(E entry); 变更为XEntryFilter#filtrate(E entry);
    3. 将Encryptor/Decryptor的构造函数中接收多个过滤器参数变成接收一个, 外部提供XEntryFilters工具类来实现多过滤器混合成一个, 避免框架自身的逻辑限制了使用者的过滤逻辑实现.
  • v1.0.6
    1. 采用LoadKit作为资源加载工具
  • v1.0.5
    1. 支持并行类加载, 需要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 950956093

xjar's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xjar's Issues

jdk11下springBoot2.x的jpa项目运行日志只加载banner

使用文档提到的java agent方式通过秘钥文件运行,因为使用默认加密,所以密钥文件里只填写了密码,结果运行时,只打印出来springBoot刚开始运行的banner图,后续没有日志了,访问端口也访问不了?请问是我配置问题吗?springBoot版本为2.1.7.RELEASE,采取的方式为使用maven打包出jar,再用户xjar加密得到加密包,通过clone下来的agent工程的jar和密钥文件去运行加密包

大神,您好, nohup 这种方式起不来呢, v2.0.6

[root@localhost project]# ll
-rw-r--r--. 1 root root 8 11月 20 13:57 a.key
-rw-------. 1 root root 598 11月 20 13:54 nohup.out
-rw-r--r--. 1 root root 214288661 11月 20 13:48 orange-encrypt.jar
[root@localhost project]# nohup java -jar ./orange-encrypt.jar --xjar.keyfile=./a.key | tailf -300 nohup.out
password:Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at io.xjar.XLauncher.(XLauncher.java:143)
at io.xjar.boot.XJarLauncher.(XJarLauncher.java:18)
at io.xjar.boot.XJarLauncher.main(XJarLauncher.java:22)
password:Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
nohup: at io.xjar.XLauncher.(XLauncher.java:143)
at io.xjar.boot.XJarLauncher.(XJarLauncher.java:18)
at io.xjar.boot.XJarLauncher.main(XJarLauncher.java:22)

classLoader保密措施

我看了一下加密后的xjar,其中的XBootClassLoader很容易就反编译出来了。

请问对于ClassLoader的保密有没有什么方案?

用密码去解密代码

大牛,启动时参数带了密码,如何防止被用密码解密。能否将危险模式里的密码再度加解密,使得即使有密码也不能反编译

加密war包无法运行

Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry WEB-INF/lib/netty-codec-4.1.34.Final.jar
	at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108)
	at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:86)
	at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:70)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
	at io.xjar.boot.XWarLauncher.launch(XWarLauncher.java:25)
	at io.xjar.boot.XWarLauncher.main(XWarLauncher.java:21)
Caused by: java.io.IOException: Unable to open nested jar file 'WEB-INF/lib/netty-codec-4.1.34.Final.jar'
	at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:256)
	at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:241)
	at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:103)
	... 5 more
Caused by: java.lang.IllegalStateException: Unable to open nested entry 'WEB-INF/lib/netty-codec-4.1.34.Final.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file
	at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:284)
	at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:264)
	at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:252)
	... 7 more

Springboot 打的war包

public class EncryptMyJar {
    public static void main(String[] args) throws Exception {
        String pwd = "123456";

        System.out.println("start");

        File plaintext = new File("a.war");
        File encrypt = new File("b.war");

        System.out.println("middle");

        XBoot.encrypt(
                plaintext,
                encrypt,
                pwd,
                (entry) -> {
                    String name = entry.getName();
                    System.out.println("entry");
                    System.out.println(name);
                    String pkg = "WEB-INF/classes/com/a/b";
//                    String pkg = "WEB-INF/classes/com/a/b";
                    return name.startsWith(pkg);
                }
        );

        System.out.println("end");
    }
}

spring boot 产生JAR无法加密,报错

java.util.zip.ZipException: Unexpected record signature: 0X622F2123
at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.getNextZipEntry(ZipArchiveInputStream.java:260)
at org.apache.commons.compress.archivers.jar.JarArchiveInputStream.getNextJarEntry(JarArchiveInputStream.java:56)
at io.xjar.boot.XBootEncryptor.encrypt(XBootEncryptor.java:79)
at io.xjar.boot.XBoot.encrypt(XBoot.java:364)
at io.xjar.boot.XBoot.encrypt(XBoot.java:307)
at io.xjar.boot.XBoot.encrypt(XBoot.java:249)
at io.xjar.boot.XBoot.encrypt(XBoot.java:234)
at io.xjar.boot.XBoot.encrypt(XBoot.java:220)
at io.xjar.boot.XBoot.encrypt(XBoot.java:207)
at com.ftvalue.XjarEncrypt.main(XjarEncrypt.java:17)

JDK12 springboot jar包加密后无法使用

环境:

  1. jdk 版本:
    openjdk12
  2. springboot 版本:
    2.1.8.RELEASE
  3. orm框架
    jpa

打包后报错情况:

2019-09-16 09:53:29.771  INFO 1 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.11.Final}
2019-09-16 09:53:29.775  INFO 1 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2019-09-16 09:53:29.987  INFO 1 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2019-09-16 09:53:30.304  WARN 1 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError
2019-09-16 09:53:30.306  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2019-09-16 09:53:30.327  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2019-09-16 09:53:30.336  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2019-09-16 09:53:30.357  INFO 1 --- [           main] ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-09-16 09:53:30.363 ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)
	at com.fd.weretail.MerchantApplication.main(MerchantApplication.java:17)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
Caused by: java.lang.ExceptionInInitializerError: null
	at org.hibernate.boot.archive.internal.StandardArchiveDescriptorFactory.buildArchiveDescriptor(StandardArchiveDescriptorFactory.java:55)
	at org.hibernate.boot.archive.internal.StandardArchiveDescriptorFactory.buildArchiveDescriptor(StandardArchiveDescriptorFactory.java:37)
	at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.buildArchiveDescriptor(AbstractScannerImpl.java:64)
	at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:46)
	at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:76)
	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:99)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:232)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:167)
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:51)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
	... 24 common frames omitted
Caused by: java.lang.reflect.InvocationTargetException: null
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.<clinit>(JarFileBasedArchiveDescriptor.java)
	... 39 common frames omitted
Caused by: java.lang.reflect.InvocationTargetException: null
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at net.bytebuddy.dynamic.Nexus.initialize(Nexus.java:137)
	... 44 common frames omitted
Caused by: java.lang.UnsupportedOperationException: Cannot get package using reflection: Cannot define nest member class java.lang.reflect.AccessibleObject$Cache + within different package then class net.bytebuddy.mirror.AccessibleObject
	at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Initializable$Unavailable.getPackage(ClassInjector.java:418)
	at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.injectRaw(ClassInjector.java:220)
	at net.bytebuddy.dynamic.loading.ClassInjector$AbstractBase.inject(ClassInjector.java:112)
	at net.bytebuddy.agent.builder.AgentBuilder$InitializationStrategy$SelfInjection$Dispatcher$InjectingInitializer.onLoad(AgentBuilder.java:3141)
	... 49 common frames omitted

打包没问题,运行报错:"main" java.lang.NoClassDefFoundError: sun/misc/URLClassPath

jdk 1.8
xjar 2.0.9

无法运行,提示:
WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by io.xjar.boot.XBootClassLoader (file:/Users/jessica/Documents/Project%20Code/dwz/target/dwz-0.0.1-SNAPSHOT.xjar) to field java.net.URLClassLoader.ucp WARNING: Please consider reporting this to the maintainers of io.xjar.boot.XBootClassLoader WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release Exception in thread "main" java.lang.NoClassDefFoundError: sun/misc/URLClassPath at io.xjar.boot.XBootClassLoader.<init>(XBootClassLoader.java:40) at io.xjar.boot.XJarLauncher.createClassLoader(XJarLauncher.java:31) at org.springframework.boot.loader.Launcher.createClassLoader(Launcher.java:65) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at io.xjar.boot.XJarLauncher.launch(XJarLauncher.java:26) at io.xjar.boot.XJarLauncher.main(XJarLauncher.java:22) Caused by: java.lang.ClassNotFoundException: sun.misc.URLClassPath at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 6 more

spring boot +jpa 打包成功后启动成功,但是访问接口时报错

项目情况

程序能加密后能正常启动成功,但是一旦访问首页或者接口就会报。
项目框架采用spring boot 2+spring data jpa,已经使用agent做了代理启动。
启动命令: java -javaagent:xjar-agent-hibernate-v1.0.0.jar -jar admin-1.0.0-SNAPSHOT.xjar

报错信息如下:

  • 2019-04-15 21:07:55.865 [http-nio-7789-exec-4] ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet][182] -Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
    java.io.IOException: Skipped only 0 bytes out of 61093 required
    at org.springframework.util.StreamUtils.copyRange(StreamUtils.java:164)
    at org.springframework.http.converter.ResourceRegionHttpMessageConverter.writeResourceRegion(ResourceRegionHttpMessageConverter.java:158)

image

java.lang.NullPointerException

class.getSource().getParentFile().getPath()
class.getProtectionDomain().getCodeSource().getLocation().getFile()

凡是加密的代码 用类似这样的代码 都报java.lang.NullPointerException

有什么解决办法吗 老大 是为什么啊

SpringBoot的src\main\resources\static下的html文件无法访问

你好,我的SpringBoot工程src\main\resources\static下有html文件,加密时不设置任何过滤器,然后以
java -jar /path/to/encrypted.jar --xjar.password=PASSWORD 方式做解密运行,Log显示SpringBoot项目已成功启动,但是在浏览器上访问html文件,始终处于等待响应的状态。请问是什么原因呢?谢谢。

建议:加密密码,解密密码,运行时密码分开

我们的业务场景是,我们对jar包加密是防止反编译,并不介意用户去使用jar包。所以对于运行时的密码并不是很在意。
现在是解密跟运行时的密码都是一个,那就增加了泄漏的风险
作者大大要不要考虑一下扩展这个功能呢?

非已有问题描述--静态资源无法正常访问

感谢作者的项目

问题描述:
前言: xjar是后来引入到系统中的,因为部署方式已经确定了,早期 配置的build配置已经将resource目录给排除出去了 项目最终部署环境是 linux
部分代码(去掉了 拷贝等的plugin
`

                <!--不打包资源文件-->

                <excludes>

                    <exclude>*.**</exclude>
                    <exclude>*/*.xml</exclude>
                </excludes>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <!--MANIFEST.MF 中 Class-Path 加入前缀-->
                        <classpathPrefix>lib/</classpathPrefix>
                        <!--jar包不包含唯一版本标识-->
                        <useUniqueVersions>false</useUniqueVersions>
                        <!--指定入口类-->
                        <mainClass>----</mainClass>
                    </manifest>
                    <manifestEntries>
                        <!--MANIFEST.MF 中 Class-Path 加入资源文件目录-->
                        <Class-Path>./resources/</Class-Path>
                    </manifestEntries>
                </archive>
                <outputDirectory>${project.build.directory}</outputDirectory>
            </configuration>

`

然后引入的时候采用的是 在test中执行XBoot.encrypt 将 jar包加密 然后再解密运行(使用解密文件)

但出现一个问题, 代码中有这么一句话
ResourceUtils.getURL("classpath:").getPath() + "static/xxx文件路径";
在没有加密解密的情况下是能正常返回路径的
但是加密后 变成了:
原本正确的项目路径+ /lib/log4j-api-2.10.0.jar!/META-INF/version/9/static/xxx文件路径

然后File自然索引不到路径 抛出错误
以上 (不过有可能是因为没有配置排除静态文件加密的原因 , 请原谅我没有去对比验证,如果作者没有遇到相关问题,我会去进行对比验证的~)

吐槽:
因为各种环境&实力原因 最终项目没有用混淆,也没有用docker 进行部署, 然后还要配置 服务自启动, 所以用的是sh脚本启动的jar 所以用的是 密码文件 解密的方式 进行解密 hhh 感觉ps ef 也是能找到的 只是加大了解密的难度, 毕竟不认识这个项目就不知道怎么解 hhh
谢谢.~

启动jar报java.lang.NoClassDefFoundError: sun/misc/URLClassPath

Exception in thread "main" java.lang.NoClassDefFoundError: sun/misc/URLClassPath
at io.xjar.boot.XBootClassLoader.(XBootClassLoader.java:40)
at io.xjar.boot.XJarLauncher.createClassLoader(XJarLauncher.java:31)
at org.springframework.boot.loader.Launcher.createClassLoader(Launcher.java:64)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
at io.xjar.boot.XJarLauncher.launch(XJarLauncher.java:26)
at io.xjar.boot.XJarLauncher.main(XJarLauncher.java:22)
Caused by: java.lang.ClassNotFoundException: sun.misc.URLClassPath
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 6 more
难道是版本问题?

某些第三依赖jar能不能不重新打包

前端用户密码等敏感信息会进行RSA加密传输到后台处理。
后台解密会用到如bcprov-jdk15on包,但此包是带签名的,加密时,这类jar包能不能不重新打包,重新打包签名会失效报错。
直接替换掉加密后的bcprov-jdk15on包,启动会报错
Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/bcprov-jdk15on-1.60.jar at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108) at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:87) at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:69)
能不能给个提示如何处理?

解密后 有引用的包 运行不了

a jar 包 引用了 多个三方包
a 加密 第三方包不加密
a 和 第三方包都在 lib 目录下
a jar 包中与第三方包有继承关系 必须要有第三方包才能运行
a jar 解密后 运行不要 继承的类 转换 不了 第三方父类 导致 运行错误

> > 修改XLauncher(最直接、最笨的办法)

修改XLauncher(最直接、最笨的办法)

public class XLauncher implements XConstants {
    public final String[] args;
    public final XDecryptor xDecryptor;
    public final XEncryptor xEncryptor;
    public final XKey xKey;

    public XLauncher(String... args) throws Exception {
        this.args = args;
        String algorithm = DEFAULT_ALGORITHM;
        int keysize = DEFAULT_KEYSIZE;
        int ivsize = DEFAULT_IVSIZE;
        **String password = "xxxxxxxxxxxxxxxx";**
        String keypath = null;
 ... ...

使用命令运行jar的时候,不报错,但不会加载jar包,直接结束了。
`D:\workspace>java -agentlib:xjar -jar xxx-encrypted.jar
(命令行下无任何信息)
D:\workspace>

OK.
C++ 解密部分代码
//解密 mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_DECRYPT, input, outout ); if (b == 381) { // 分块后剩余字节数 memcpy(&dest[6096], outout, **9**); } else { memcpy(&dest[b * 16], outout, 16); } b++;
分块数目和输出字节需要根据生成的数据大小重新计算。本人获取得大小为6672 .b=417
if (b == 417) { // 分块后剩余字节数 memcpy(&dest[6672], outout, 0); }
成功运行

Originally posted by @Ftrybe in #1 (comment)

校验bcpkix-jdk15on签名时报错

hello,是这样的。最近在用xjar加密了一个spring cloud项目,加密后的程序可以运行起来,但是某个接口请求处理过程中就出错了。这个接口会调用hutool的SecurityUtil.aes()去解密一个东西,这个方法内部会创建一个Cipher,Cipher内部会校验jar包,结果校验到bcpkix-jdk15on这个jar包(在BOOT-INF/lib中)时就出错了。因为这个jar包本身做了签名,xjar处理后的jar包计算出来的签名,与这个jar包里面的manifest的签名不匹配,所以报错了。不知道之前有没有人报过这个问题,如果需要更多的信息可以找我了解,谢谢

jpa兼容问题

我在我的springboot项目里使用了jpa,然后用xjar加密运行报错:
org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile
如果只是单独运行jar不会报错

密钥文件中的明文密码可否进行加密

可否提供一个加密算法,通过命令行对用户的密码做一次加密,加密串作为密钥文件的password值,运行时,在程序内部通过算法解密后得到解密口令,从而解密class文件,用户无法通过加密串直接解密class文件。
加密算法可不公开,或采用不易被反编译的语言编写。
正常运维中,很难保证不出现服务器重启的情况,删除密钥文件,会造成不i必要的运维成本。请酌情考虑。
感谢您喝您的团队卓越的贡献。

加密之后包变大了

加密之前是97M,加密之后是222M,这都翻倍了。有什么办法解决这个问题么,尽量小点。

使用xjar-maven-plugin方式打包抛出ClassNotFoundException

通过在pom.xml文件中添加xjar-maven-plugin插件,抛出异常: java.lang.ClassNotFoundException: org.apache.commons.compress.archivers.jar.JarArchiveInputStream。
maven的本地仓库明明有org.apache.commons/commons-compress 1.18版本的jar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.