jar包加密方案分享

目录
  • 前言
  • 基础环境准备
  • 开始加密
  • 运行加密后的jar包
  • 后记
  • 其他的加密方案参考:

前言

jar包相信大家都很熟悉,是通过打包java工程而获得的产物,但是jar包是有一个致命的缺点的,那就是很容易被反编译,只需要使用jd-gui就可以很容易的获取到java源码。

如果你想要防止别人反编译做逆向工程,那么对jar包进行一次加密就是一项很重要的工作了。

开源jar加密分为两种一种代码混淆,一种字节码转换。

字节码混淆,主要思路就是的对类名,变量名和方法名,局部参数名进行替换,让其命名变得无意义,很难读懂,但不影响其逻辑,但对于有耐心的人,还是能看明白!具体实现是在编译前做的混淆,还是编译后做的混淆,这个没用过不太清楚。

字节码转换,分为两块,一块是加密,对编译后class文件进行字节码转换(可以采用加密算法,字节码异或运算或自己定义规则);一块是解密,就是在类加载的时候对加密的字节码进行解密。加密这块因为在本地对class文件字节码转换,比较简单,方式也随意;解密这块主要围绕类加载器来做文章,又可分为java版实现和C/C++版实现,java版主要基于-agentJava:xxx.jar,通过Premain-Class,向Instrumentation注入ClassFileTransformer实现,自己在ClassFileTransformer中对需要解密的class文件进行解密;C/C++主要使用-agentpath:xxx.so,基于JVMTI通过C/C++实现,对类加载过程进行操作。

总体来说:代码混淆和字节码转换可以结合,例如,先代码混淆后,再对字节码加密,运行时对字节码解密。代码混淆,上手最简单,加密级别比较低,也容易破解。字节码转换,java版本对于java熟练人员上手很快,加密级别一般,个人理解该方式一个缺陷就是对于想加密的内容加密了,但解密方式暴露了,如果能够隐藏好解密方式,加密安全系数还是蛮高;C/C++版加密级别最高,但需要对java和C/C++都很熟练,而且需要研究JVMTI相关知识,如果真的实现了基本无破解风险,不过对于SpringBoot等框架,其内部会直接分析class文件,有些坑需要解决。

另外一个问题就是,使用jar加密这块,需要确定好是对运行的主程序jar包加密,还是第三方jar加密,其还是有部分差异的。

基础环境准备

现在假设你的项目是一个maven项目(目前不使用maven的项目已经不多了),那么加密起来特别的容易,

首先就是要在你的pom文件中增加插件仓库地址,如下:

    <pluginRepositories>
        <pluginRepository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </pluginRepository>
    </pluginRepositories>

然后在pom文件中增加如下插件:

<plugin>
                <groupId>com.github.core-lib</groupId>
                <artifactId>xjar-maven-plugin</artifactId>
                <version>4.0.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <phase>install</phase>

                        <configuration>
                            <includes>
                                <include>/com/huc/**/*.class</include>
                                <include>/mapper/**/*Mapper.xml</include>
                                <include>/*.yml</include>
                            </includes>
                            <excludes>
                                <exclude>/templates/**.*</exclude>
                                <exclude>/static/**.*</exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

这样,我们的准备工作就做完了,需要注意的是,includes代表我们想要加密的内容,采用的是Ant表达式,excludes代表的是不需要加密的内容,同样使用的Ant表达式。

一般情况下我们建议这两处内容必填,如果不填写,会加密整个jar包中的所有文件,这样其实是没有必要的,而且全部加密后启动的时候也可能产生意料之外的错误。

另外要说明的是,加密后的jar包是需要通过golang环境运行的,所以我们需要提前把golang的运行环境安装好,安装过程请自行百度。

开始加密

现在我们就开始正式的加密工作了,加密过程非常简单,只需要使用maven的install命令即可自动打包,命令如下:

mvn clean install -Dxjar.password=password  -Dmaven.test.skip=true

这里的password可以自行指定密码,是必填项。

执行后就会得到两个文件:一个是xjar.go的go源文件,一个是你项目的xjar包,也就是加密后的jar包。

运行加密后的jar包

运行加密后的jar包是需要先编译xjar.go源文件生成jar包启动器的。编译方式如下:

go build ./xjar.go

编译后会生成xjar.exe启动器(王子使用的是window系统,如果是linux系统就不是exe后缀了)。

之后使用如下命令即可运行加密后的jar包:

./xjar.exe java -jar ./**.xjar

可以看出,只是在使用java -jar的前边加上启动器即可,还是很方便的。

后记

防止反编译只能防止jar包被逆向破解,如果想要限制用户的使用时间,按时间付费需要怎么做呢?

这就要说到license加密技术了,我们下篇文章就来说说如何在你的项目中增加license,限制用户的使用。

其他的加密方案参考:

ClassFinal:Mr.K/ClassFinal

基于字节码转换java版,国人实现的,蛮不错的,对SpringBoot支持也好,其逻辑就是基于-agentJava:xxx.jar这一套原理,加密时对class文件做了两次处理,一次是对class文件的字节码完全加密,一次是对class文件混淆,这个混淆是保留成员和方法,对方法内部实现进行隐藏;解密时,判断如果该类是自己加密过的,找到完全加密的字节码进行解密,如果不是自己加密的就跳过。其对class文件混淆,就是方便类似SpringBoot等三方框架直接分析class文件。好处就是,如果你是个工具包,加密后给其它人,其他人编程时引用或者编译都不影响,但是运行时需要加密方支持,给出秘钥之类的。比较灵活和好用,也存在该方式的统一缺陷,不过其支持主程序jar加密,也支持单独的第三方工具jar加密。

JarEncrypt:https://github.com/zhikun0704/api-zxv-jvmit

基于字节码转换C/C++版,基于JVMIT个人实现的,稍微研究了下,其支持对部分class加密,对应一般java应用问题不大,但对于SpringBoot项目支持可能有些问题。因本人C++水平有限,没有深层次研究,希望有C/C++和java都熟悉的大神有空搞一套完整的。

以上就是jar包加密方案分享的详细内容,更多关于jar包加密的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java RSA加密解密实现方法分析【附BASE64 jar包下载】

    本文实例讲述了Java RSA加密解密实现方法.分享给大家供大家参考,具体如下: 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar javabase64-1.3.1.jar 本站下载地址. 注意: RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行. RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常: Exception in thread "main" javax.cryp

  • Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法

    Kettle中使用JavaScript调用jar包对文件内容进行MD5加密.本文主要知识点: JavaScript调用jar包对文件内容进行MD5加密,返回加密md5值 Kettle实现对文件内容的加密,返回加密md5值 2.使用方法 1)下载jar包 http://xiazai.jb51.net/202009/yuanma/filemd5hash_jb51.rar 2)将jar包导入Kettle的lib目录下 3)重启Kettle Spoon.bat,使得kettle加载到新加入的jar包,下

  • python 逆向爬虫正确调用 JAR 加密逻辑

    1. 前言 在 App 端爬虫过程中,遇到未知的参数,往往需要我们去逆向破解 App,针对参数的生成逻辑,使用 Python 去实现 部分 App 参数的生成逻辑可能已经写入到多个 JAR 文件中,这时候,我们只需要用 Python 执行 JAR 即可 本篇文章将聊聊 Python 如何调用 JAR 中的方法 2. 合并 JAR ​以 Android App 为例,假设加密参数生成逻辑在多个 JAR 中,我们首先需要将所有的 JAR 文件合并为一个 JAR 文件 PS:对于 AAR 文件,可以先

  • jar包加密方案分享

    目录 前言 基础环境准备 开始加密 运行加密后的jar包 后记 其他的加密方案参考: 前言 jar包相信大家都很熟悉,是通过打包java工程而获得的产物,但是jar包是有一个致命的缺点的,那就是很容易被反编译,只需要使用jd-gui就可以很容易的获取到java源码. 如果你想要防止别人反编译做逆向工程,那么对jar包进行一次加密就是一项很重要的工作了. 开源jar加密分为两种一种代码混淆,一种字节码转换. 字节码混淆,主要思路就是的对类名,变量名和方法名,局部参数名进行替换,让其命名变得无意义,

  • python matplotlib包图像配色方案分享

    可选的配色方案: Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_

  • Vue清除定时器setInterval优化方案分享

    两种方案清除定时器,开发者经常使用方案1,建议使用方案2 方案1 首先我在data函数里面进行定义定时器名称: data() { return { timer: null // 定时器名称 } }, 然后这样使用定时器: this.timer = (() => { // 某些操作 }, 1000) 最后在beforeDestroy()生命周期内清除定时器: beforeDestroy() { clearInterval(this.timer); this.timer = null; } 方案1有

  • Android加载长图的多种方案分享

    背景介绍 在某些特定场景下,我们需要考虑加载长图的需求,比如加载一幅<清明上河图>,这个好像有点过分了,那就加载1/2的<清明上河图>吧... 那TMD还不是一样道理. 言归正传说一下我这边遇到的情况,之前有图片或大图的模块是划分为H5来实现的,现在需求变更划分为原生开发,那么问题就来了. 图片尺寸为 图片大小为 这一刻我是懵逼的,哪个端图片上传的时候没限制尺寸和压缩?mdzz, 吐槽归吐槽,还是要撸起袖子解决加载长图大图的问题. 先提供几个技术方案来对比一下: 方案1:WebVi

  • Python正确调用 jar 包加密得到加密值的操作方法

    前言 在做接口自动化的时候,经常会遇到一些参数是需要加密的,比如密码参数. 加密规则一般开发也不愿意告诉你,会直接给你一个jar包,让你调用jar包得到加密值,在jmeter上是可以直接引用jar包的,但python调用jar包会有点麻烦. 环境准备 我的电脑环境: windows10 python3.6.6 (64位) jdk 1.8.0_20 (64位) 安装jdk的时候,也会顺带安装了jre, 安装目录结构如下(jdk的安装自己网上找详细教程) 安装完成后检查版本号和jar命令 C:\Us

  • SpringBoot全局异常处理方案分享

    目录 一 业务场景 二 全局系统异常类 一)全局系统异常类 二) 包装异常返回结果给前端,修改自定义异常 三 返回案例 一 业务场景 调用接口时需要对属性进行校验,比如属性长度,当属性为邮箱时校验邮箱格式等,这时候要要用到@Validated注解,在使用这个注解后发现出现了一个问题,调用接口后并没有返回我们想要的报错结果,而是返回了 "message": "Validation failed for object='IMMessageSend'. Error count: 1

  • JS前端接口请求参数混淆方案分享

    目录 写在前面 什么接口的参数需要做处理 参数处理 Aes加密 Rsa加密 签名验证 处理时机 后端实现 Rsa解密 Aes解密 处理中间件 路由中使用 写在前面 在一些接口请求的场景中,我们希望携带的数据不希望是以明文的方式提交的,也就是需要对参数做一些混淆或者加密处理,后端拿到数据后再进行解密,得到真实数据. 其目的是为了保护数据的安全,以及提高被识破成明文的门槛.在例如用户登录的接口请求中,如果账号和密码是以明文传输的,会容易导致一些安全性问题,同时,我们也不希望谁都可以伪造参数对接口发起

  • Java对象转换的方案分享

    目录 前言 为什么模型要分这么多层? 模型之间的转换 建议不要用的方式 常用的方式 使用方式 定义对象 BeanCopier 最简单的使用方式 创建可复用的BeanCopier工具类 MapStruct 引入mapstruct 简单Demo 常见用法 性能测试 测试代码 测试结果 最后 前言 系统变的复杂,系统的层次划分越来越细,边界也越来越明确. 然后每一层之间一般都有自己要处理的领域对象,统称为pojo一般在model或者domain包下(类的后缀不能为pojo). 常见的一些模型类型: P

  • c#并行任务多种优化方案分享(异步委托)

    遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功后从数据库获取数据(GetDatFromDb) 任务4:使用2.3的数据执行一个方法 (StartProcess) 一个比较笨的方法(本人最开始的方法,记为方法1)是直接开启一个线程,按照顺序依次执行四个任务: 复制代码 代码如下: new Thread(delegate              

  • Mysql性能优化方案分享

    网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化. mysql> show global status; 可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句: mysql> show variables; 一.慢查询

随机推荐