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>
        
        <groupId>net.roseboygroupId>
        <artifactId>classfinal-maven-pluginartifactId>
        <version>${classfinal.version}version>
        <configuration>
            <password>000000password>
            
            <packages>com.yourpackage,com.yourpackage2packages>
            <cfgfiles>application.ymlcfgfiles>
            <excludes>org.springexcludes>
            <libjars>a.jar,b.jarlibjars>
        configuration>
        <executions>
            <execution>
                <phase>packagephase>
                <goals>
                    <goal>classFinalgoal>
                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>
    
    <repositories>
        <repository>
            <id>jitpack.ioid>
            <url>https://www.jitpack.iourl>
        repository>
    repositories>
    
    <dependencies>
        <dependency>
            <groupId>com.github.core-libgroupId>
            <artifactId>xjarartifactId>
            <version>4.0.1version>
        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
    

你可能感兴趣的:(java,java,spring,开发语言)