JAR包加密方案

JAR包加密方案

1 ClassFinal

ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。
本工具使用AES算法加密class文件,密码是保证不被破解的关键,请保存好密码,请勿泄漏。密码一旦忘记,项目不可启动且无法恢复,请牢记密码。
本工具加密后,原始的class文件并不会完全被加密,只是方法体被清空,保留方法参数、注解等信息,这是为了兼容spring,swagger等扫描注解的框架; 方法体被清空后,反编译者只能看到方法名和注解,看不到方法的具体内容;当class被classloader加载时,真正的方法体会被解密注入。

1.1功能特性

  • 无需修改原项目代码,只要把编译好的jar/war包用本工具加密即可。
  • 运行加密项目时,无需求修改tomcat,spring等源代码。
  • 支持普通jar包、springboot jar包以及普通java web项目编译的war包。
  • 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架。
  • 支持maven插件,添加插件后在打包过程中自动加密。
  • 支持加密WEB-INF/lib或BOOT-INF/lib下的依赖jar包。
  • 支持绑定机器,项目加密后只能在特定机器运行。
  • 支持加密springboot的配置文件。

1.2加密方式

1.2.1 命令行加密

  1. 下载jar包,
    地址链接
  2. 执行命令:
java -jar classfinal-fatjar.jar -file yourpaoject.jar -libjars a.jar,b.jar -packages com.yourpackage,com.yourpackage2 -exclude com.yourpackage.Main -pwd 123456 -Y

对单个jar进行打包处理的时候,命令中一定要有-packages,否则不加密。

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

结果: 生成 yourpaoject-encrypted.jar,这个就是加密后的jar文件;加密后的文件不可直接执行,需要配置javaagent。
说明: 以上示例是直接用参数执行,也可以直接执行 java -jar classfinal-fatjar.jar按照步骤提示输入信息完成加密。

1.2.2 maven插件集成

在要加密的项目pom.xml中加入以下插件配置,目前最新版本是:1.2.1。

<plugin>
        <!-- https://gitee.com/roseboy/classfinal -->
        <groupId>net.roseboy</groupId>
        <artifactId>classfinal-maven-plugin</artifactId>
        <version>${classfinal.version}</version>
        <configuration>
            <password>000000</password>
            <!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码-->
            <packages>com.yourpackage,com.yourpackage2</packages>
            <cfgfiles>application.yml</cfgfiles>
            <excludes>org.spring</excludes>
            <libjars>a.jar,b.jar</libjars>
        </configuration>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>classFinal</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

运行mvn package时会在target下自动加密生成yourproject-encrypted.jar。
maven插件的参数名称与直接运行的参数相同,请参考上节的参数说明。
加密时-pwd参数设为#,启动时可不用输入密码; 如果是war包,启动时指定参数 -nopwd,跳过输密码过程。

1.3 启动服务

加密后的项目需要设置javaagent来启动,项目在启动过程中解密class,完全内存解密,不留下任何解密后的文件。解密功能已经自动加入到 yourpaoject-encrypted.jar中,所以启动时-javaagent与-jar相同,不需要额外的jar包。
启动jar项目执行以下命令:

java -javaagent:yourpaoject-encrypted.jar='-pwd 0000000' -jar yourpaoject-encrypted.jar//参数说明// -pwd      加密项目的密码  // -pwdname  环境变量中密码的名字

或者不加pwd参数直接启动,启动后在控制台里输入密码,推荐使用这种方式:

java -javaagent:yourpaoject-encrypted.jar -jar yourpaoject-encrypted.jar

2 XJar

2.1功能特性

  • 无需侵入代码,只需要把编译好的 JAR 包通过工具加密即可。
  • 完全内存解密,杜绝源码以及字节码泄露以及反编译。
  • 支持所有 JDK 内置加解密算法。
  • 可选择需要加解密的字节码或其他资源文件,避免计算资源浪费。

2.2使用方式

1.创建一个新的maven加解密项目,引入依赖

<project>
    <!-- 设置 jitpack.io 仓库 -->
    <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://www.jitpack.io</url>
        </repository>
    </repositories>
    <!-- 添加 XJar 依赖 -->
    <dependencies>
        <dependency>
            <groupId>com.github.core-lib</groupId>
            <artifactId>xjar</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>
</project>

2.编写加密代码

/**
 * 加密
 **/
public static void encrypt() throws Exception {
	XCryptos.encryption()
			// 源码包路径
			.from("E:\\project\\ecloud-meeting\\target\\ecloud-meeting.jar")
			// 加密密码
			.use("Ecloud_MT")
			// 指定需要加密的文件
			.include("/com/ecloud/**/*.class")
			.include("/mybatis/**/*Mapper.xml")
			// 指定不加密的文件
			.exclude("/static/**/*")
			// 加密后的jar包路径
			.to("C:\\Users\\dell\\Desktop\\ecloud-meeting.jar");
}

/**
 * 解密
 **/
public static void decrypt() throws Exception {
	XCryptos.decryption()
			.from("C:\\Users\\dell\\Desktop\\ecloud-meeting.jar")
			.use("Ecloud_MT")
			.to("C:\\Users\\dell\\Desktop\\ecloud-meeting-decrypt.jar");
}

public static void main(String[] args) throws Exception {
	// 加密
	XJar.encrypt();
	// XJar.decrypt();
}

XJAR的包中提供加密和解密的工具类,工具类提供加密密码,指定加密文件,指定不加密文件等基础的方法。

2.3 启动服务

Jar包加密后,会在加密的Jar包(to方法的路径下)同级目录生成一个xjar.go的文件,这里需要把go文件进行编译才能运行启动jar包。

  • 编译go文件
    把xjar.go复制到具有go语言环境的服务器(注意区分windows和linux),执行以下命令:
    go build xjar.go
    

Windows环境会生成一个xjar.exe文件,linux会生成一个xjar的可执行文件。

  • 启动服务

    xjar java -jar ***.jar
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值