【安全】JAR包防反编译方案

为了防止源码被泄露,一般要对代码进行混淆或者加密,尝试了几种混淆方案,对于部分代码可以混淆,但是对数据结构、数据库操作、映射文件等数据无法混淆,导致大部分代码还是暴露在可以被直接获取的层面。后来找到一个开源工具XJar,可以直接对JAR包进行加密。

加密方案

XJar

XJar是Spring Boot JAR 安全加密运行工具,同时支持的原生JAR。
基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动,动态解密运行的方案,避免源码泄露或反编译。

XJar的使用
获取xjar.jar

在IDE中导入XJar工程,由于默认maven配置打包不包含依赖包,会导致生成的Xjar.jar在加密工程中不生效。
于是做了如下修改:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
     <version>2.4.1</version>
    <configuration>
        <!-- get all project dependencies -->
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <!-- MainClass in mainfest make a executable jar -->
        <archive>
            <manifest>
                <mainClass>util.Microseer</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <!-- bind to the packaging phase -->
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
         </execution>
    </executions>
</plugin>

最终打包出来包含有依赖jar包xjar-v1.1.0-jar-with-dependencies.jar

编写加解密工程

工程引入xjar-v1.1.0-jar-with-dependencies.jar
并新建main方法

package com.c;

import io.xjar.boot.XBoot;

import java.io.File;

/**
 * 代码描述
 *
 * @author c 2019/1/7
 */
public class Application {

        // Spring-Boot Jar包加密
        public static void main(String[] args) throws Exception {
            // 加密密钥
            String password = "yourpassword";

            File plaintext = new File("C:\\Users\\xxx\\platform-exec.jar");
            File encrypted = new File("C:\\Users\\xxx\\platform.jar");
            XBoot.encrypt(plaintext, encrypted, password);
        }

        //    // Spring-Boot Jar包解密
        //    public static void main(String[] args) throws Exception {
        //        String password = "yourpassword";
        //        File encrypted = new File("C:\\Users\\xxx\\platform.jar");
        //        File decrypted = new File("C:\\Users\\xxx\\platform-temp.jar");
        //        XBoot.decrypt(encrypted, decrypted, password);
        //    }
}

则得到加密后的platform.jar包

运行加密后的包

通过java -jar platform.jar运行jar包的时候发现,需要输入密码,但是这样交付的时候其实把密码已经泄露了,用解密方法一解密,源码依旧会被看到。

搜索关键字password:
获取到io.xjar.boot.XBootLauncher的public XBootLauncher(String… args)方法中有如下代码

if (password == null) {
    Console console = System.console();
    char[] chars = console.readPassword("password:");
    password = new String(chars);
}

这里是获取了用户输入的密码,然后写入password变量中再做后续动作,将该代码修改为

if (password == null) {
    password = "yourpassword";
}

同时io.xjar.jar.XJarLauncher的public XJarLauncher(String… args)方法中也有上述代码,同样的进行修改

则在运行的时候,不会再提示输入password。

参考资料

XJar: Spring-Boot JAR 包加密运行工具,避免源码泄露以及反编译

XJar源码

Jar包class反编译工具是一种在线工具,可用于将Jar包文件中的class文件进行反编译。 这种工具的主要功能是将编译后的Java字节码文件恢复成可读性较高的Java源代码,方便开发人员进行代码的理解、修改及调试等工作。 在线的Jar包class反编译工具通常通过上传Jar包文件,然后在服务器端进行反编译处理,最后将反编译后的Java源代码以可下载的方式提供给用户。 使用这种工具,用户无需下载和安装额外的软件,只需将需要反编译Jar包文件上传到在线平台,即可获得相应的Java源代码。 Jar包class反编译工具的优势之一是方便快捷,用户只需几步操作即可获得反编译后的Java源代码,节省了安装配置和学习使用其他反编译工具的时间。 同时,由于是在线工具,也更加适用于需要临时反编译的场景,不需要在本地长期保留相关软件。 然而,需要注意的是,由于涉及源代码的反编译,应确保拥有合法的授权和权限,遵守相关的法律和规定。 另外,Jar包class反编译工具反编译出的Java源代码可能与原始代码存在一定的差异,并且可能不包含原始注释等附加信息。因此,在使用反编译代码时,需要根据具体情况进行审慎分析和验证。 总之,Jar包class反编译工具的在线版本是一种方便快捷的工具,能够帮助开发人员在需要反编译Jar包文件的时候,快速获取Java源代码,提高效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值