CN112733094A - 一种Java应用程序的安全保护方法 - Google Patents
一种Java应用程序的安全保护方法 Download PDFInfo
- Publication number
- CN112733094A CN112733094A CN202110038384.6A CN202110038384A CN112733094A CN 112733094 A CN112733094 A CN 112733094A CN 202110038384 A CN202110038384 A CN 202110038384A CN 112733094 A CN112733094 A CN 112733094A
- Authority
- CN
- China
- Prior art keywords
- java
- program
- authorization
- license
- application
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 42
- 238000013475 authorization Methods 0.000 claims abstract description 50
- 238000012795 verification Methods 0.000 claims abstract description 31
- 238000004806 packaging method and process Methods 0.000 claims abstract description 9
- 238000005516 engineering process Methods 0.000 claims description 13
- 239000000284 extract Substances 0.000 claims description 3
- 238000005336 cracking Methods 0.000 abstract description 6
- 230000009286 beneficial effect Effects 0.000 abstract description 2
- 238000005457 optimization Methods 0.000 description 5
- 230000007547 defect Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000002787 reinforcement Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种Java应用程序的安全保护方法,包括编译打包环节及程序运行环节,其中编译打包环节包括编译的时候对java生成的应用进行混淆,增加反编译后的阅读难度;对混淆后的应用进行加密,并生成解密密钥供后续使用;使用Go语言给加密后的应用加壳,并将解密密钥、授权校验算法写进Go编写的程序里面;最终生成一个加壳的启动应用和加密后的Java应用程序;根据客户服务器相关信息,利用RSA加密,生成license授权文件。本发明所达到的有益效果是:Java class是混淆的无法正常阅读,破解难度大;安全壳采用跨平台的Go语言编写,可随Java一起可以跨平台部署。
Description
技术领域
本发明涉及Java应用安全保护技术领域,具体为一种Java应用程序的安全保护方法。
背景技术
Java语言以其良好的面向对象特性和跨平台可移植特性获得了广泛的应用。但由于其编译器编译生成的class文件非常容易被反编译软件反编译而导致源代码的泄露,这样对代码享有版权的公司就无法有效的保证其软件不被非法破解和运行。
现有技术中,为了保护Java的安全性,常使用以下几种解决方案:
1、代码混淆,通过代码混淆软件对Java源代码进行混淆,使得代码逻辑发生改变,导致反编译后的class文件可读性变差,不易读取。但还是可以反编译,破解者还是可以找到关键信息,使用字节码增强技术达到破解目的。
代码混淆(Code Obfuscation)指对发布出去的程序进行改变、重新组织,如将代码中的元素如变量、方法、类的名字改成无意义的名字使得阅读的人无法根据名字猜测其用途;重写代码中的部分逻辑,使得更能理解。
2、class加密,为了防止class文件直接反编译,开发人员将class文件进行加密,并通过自定义的类加载器(ClassLoader)进行解密之后装载到虚拟机中执行。但是这种方案存在两种缺陷,1、解密密钥容易泄露,破解者拿到密钥反向解密class文件,再通过反编译技术进行破解;2、就算拿不到密钥,但由于自定义类的加载器本身无法加密,还是可以通过反编译通读其含义,然后使用修改Java字节码的方式破解。
ClassLoader:Java的class加载器,将class文件加载到jvm虚拟机中,程序就可以正常运行。
3、安全加壳,使用C,C++等技术对应应用安全加固的一种方法,即对原始的Java应用程序进行加密,从而使得破解无法反编译。但是破解者还是可以使用JVMTI技术来动态修改授权校验逻辑,从而达到非法使用。
以上方案不管防止反编译或破解的难易成都如何,只是增加了破解的难度,因为它始终都无法避免Java自身提供的JVMTI、Instrument,它相当于打开运行时JVM的钥匙,可以动态的对运行中的程序进行修改,比最终绕过授权校验算法。
Instrument是JVM提供的一个可以修改已加载类的类库,专门为Java语言编写的插桩服务提供支持。它需要依赖JVMTI的Attach API机制实现。
JVMTI,也就是JVMTool Interface,它是JVM暴露出来的一些供用户扩展的接口集合,JVMTI是基于事件驱动的,JVM每执行到一定的逻辑就会调用一些事件的回调接口(如果有的话),这些接口可以供开发者去扩展自己的逻辑。
Agent就是JVMTI的一种实现,Agent有两种启动方式:
1、随Java进程启动而启动,经常见到的java-agentlib就是这种方式;
运行时载入,通过attach API,将模块(jar包)动态地Attach到指定进程id的Java进程内。
为解决上述问题,因此我们提出一种Java应用程序的安全保护方法。
发明内容
本发明要解决的技术问题是克服现有技术的缺陷,提供一种Java应用程序的安全保护方法,为了解决上述技术问题,本发明提供了如下的技术方案:
本发明提供一种Java应用程序的安全保护方法,包括编译打包环节及程序运行环节,其中,
所述编译打包环节包括如下步骤:
步骤1.1)编译的时候对java生成的应用进行混淆,增加反编译后的阅读难度;
步骤1.2)对混淆后的应用进行加密,并生成解密密钥供后续使用;
步骤1.3)使用Go语言给加密后的应用加壳,并将解密密钥、授权校验算法写进Go编写的程序里面;
步骤1.4)最终生成一个加壳的启动应用和加密后的Java应用程序;
步骤1.5)根据客户服务器相关信息,利用RSA加密,生成license授权文件;
所述程序运行环节包括如下步骤:
步骤2.1)安全加壳的应用启动加密后的Java应用;
步骤2.2)安全壳读取license文件,提取相关校验信息;
步骤2.3)安全壳给Java应用写入程序的解密密钥、授权校验算法、license校验信息;
步骤2.4)自定义ClassLoader对class文件进行加载,并通过上述解密密钥对class进行解密,然后交给jvm正常执行;
步骤2.5)解密后通过字节码增强技术,随机对某些class中的某些方法写入授权校验算法;
步骤2.6)启动后首先进行授权校验,若非法则程序退出;
步骤2.7)程序正常运行后,实时进行授权校验,若授权到期,则提示应用授权已经到期。
作为如上所述技术方案的进一步优化,所述步骤1.1)包括如下内容:
代码中的类、方法、属性、参数,替换成无意义的可读性差的值,增加阅读难度;
用同等意义的逻辑来替换一些逻辑,增加阅读难度;
增加一些跳转指令改变一些控制流程。
作为如上所述技术方案的进一步优化,所述步骤1.2)包括如下内容:
无需侵入代码,对编译好的class进行加密;
指定不同加密算法,并随机生成加密密钥。
作为如上所述技术方案的进一步优化,所述步骤1.3)包括如下内容:
采用Go语言编写,利用Go语言的跨平台特性,支持不同操作系统;
Go语言编写的安全壳的源文件应由上述加密后自动生成的;
其中文件里面应该有读取license文件并进行解密,提取授权信息;
其中文件里面应该写入解密密钥、licenses授权校验算法;
其中文件里面启动Java程序的逻辑应该包含向Java传入解密密钥、license授权校验算法、license信息;
安全壳启动时禁止java agent跟随Java进程启动而启动。
作为如上所述技术方案的进一步优化,所述步骤2.5)包括如下内容:
充分利用Java字节码增强技术,向已有的程序逻辑中动态写入license授权校验算法;
随机写入license授权校验算法,与下一次重启后的字节码完全不一样,从而实现破解者利用agent attach api无法定位和破解license授权校验。
与现有技术相比,本发明所达到的有益效果是:1、Java class是混淆的无法正常阅读,破解难度大;
2、安全壳采用跨平台的Go语言编写,可随Java一起可以跨平台部署;
3、安全壳中校验Java启动参数,禁止agent跟随Java进程一起启动;
4、加密过程无侵入,不影响已有开发流程;
5、解密完全内存进行,避免解密密钥泄露;
利用字节码技术,每次启动都动态随机在某些类某些方法中动态写入授权校验算法,如此破解者也只能当前运行时所看到授权算法以及所在的位置,而达到利用字节码增强技术绕过授权校验算法的agent技术无法实现。
附图说明
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
图1是本发明一种Java应用程序的安全保护方法中编译打包环节的方法流程示意图;
图2是本发明一种Java应用程序的安全保护方法中程序运行环节的方法流程示意图。
具体实施方式
以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
实施例
如图1-2所示,一种Java应用程序的安全保护方法,包括编译打包环节及程序运行环节,其中,
所述编译打包环节包括如下步骤:
步骤1.1)编译的时候对java生成的应用进行混淆,增加反编译后的阅读难度;
步骤1.2)对混淆后的应用进行加密,并生成解密密钥供后续使用;
步骤1.3)使用Go语言给加密后的应用加壳,并将解密密钥、授权校验算法写进Go编写的程序里面;
步骤1.4)最终生成一个加壳的启动应用和加密后的Java应用程序;
步骤1.5)根据客户服务器相关信息,利用RSA加密,生成license授权文件;
所述程序运行环节包括如下步骤:
步骤2.1)安全加壳的应用启动加密后的Java应用;
步骤2.2)安全壳读取license文件,提取相关校验信息;
步骤2.3)安全壳给Java应用写入程序的解密密钥、授权校验算法、license校验信息;
步骤2.4)自定义ClassLoader对class文件进行加载,并通过上述解密密钥对class进行解密,然后交给jvm正常执行;
步骤2.5)解密后通过字节码增强技术,随机对某些class中的某些方法写入授权校验算法;
步骤2.6)启动后首先进行授权校验,若非法则程序退出;
步骤2.7)程序正常运行后,实时进行授权校验,若授权到期,则提示应用授权已经到期。
在本实施例中,作为优选地,所述步骤1.1)包括如下内容:
代码中的类、方法、属性、参数,替换成无意义的可读性差的值,增加阅读难度;
用同等意义的逻辑来替换一些逻辑,增加阅读难度;
增加一些跳转指令改变一些控制流程。
在本实施例中,作为优选地,所述步骤1.2)包括如下内容:
无需侵入代码,对编译好的class进行加密;
指定不同加密算法,并随机生成加密密钥。
在本实施例中,作为优选地,所述步骤1.3)包括如下内容:
采用Go语言编写,利用Go语言的跨平台特性,支持不同操作系统;
Go语言编写的安全壳的源文件应由上述加密后自动生成的;
其中文件里面应该有读取license文件并进行解密,提取授权信息;
其中文件里面应该写入解密密钥、licenses授权校验算法;
其中文件里面启动Java程序的逻辑应该包含向Java传入解密密钥、license授权校验算法、license信息;
安全壳启动时禁止java agent跟随Java进程启动而启动。
作为如上所述技术方案的进一步优化,所述步骤2.5)包括如下内容:
充分利用Java字节码增强技术,向已有的程序逻辑中动态写入license授权校验算法;
随机写入license授权校验算法,与下一次重启后的字节码完全不一样,从而实现破解者利用agent attach api无法定位和破解license授权校验。
最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (5)
1.一种Java应用程序的安全保护方法,其特征在于,包括编译打包环节及程序运行环节,其中,
所述编译打包环节包括如下步骤:
步骤1.1)编译的时候对java生成的应用进行混淆,增加反编译后的阅读难度;
步骤1.2)对混淆后的应用进行加密,并生成解密密钥供后续使用;
步骤1.3)使用Go语言给加密后的应用加壳,并将解密密钥、授权校验算法写进Go编写的程序里面;
步骤1.4)最终生成一个加壳的启动应用和加密后的Java应用程序;
步骤1.5)根据客户服务器相关信息,利用RSA加密,生成license授权文件;
所述程序运行环节包括如下步骤:
步骤2.1)安全加壳的应用启动加密后的Java应用;
步骤2.2)安全壳读取license文件,提取相关校验信息;
步骤2.3)安全壳给Java应用写入程序的解密密钥、授权校验算法、license校验信息;
步骤2.4)自定义ClassLoader对class文件进行加载,并通过上述解密密钥对class进行解密,然后交给jvm正常执行;
步骤2.5)解密后通过字节码增强技术,随机对某些class中的某些方法写入授权校验算法;
步骤2.6)启动后首先进行授权校验,若非法则程序退出;
步骤2.7)程序正常运行后,实时进行授权校验,若授权到期,则提示应用授权已经到期。
2.如权利要求1所述的一种Java应用程序的安全保护方法,其特征在于,所述步骤1.1)包括如下内容:
代码中的类、方法、属性、参数,替换成无意义的可读性差的值,增加阅读难度;
用同等意义的逻辑来替换一些逻辑,增加阅读难度;
增加一些跳转指令改变一些控制流程。
3.如权利要求1所述的一种Java应用程序的安全保护方法,其特征在于,所述步骤1.2)包括如下内容:
无需侵入代码,对编译好的class进行加密;
指定不同加密算法,并随机生成加密密钥。
4.如权利要求1所述的一种Java应用程序的安全保护方法,其特征在于,所述步骤1.3)包括如下内容:
采用Go语言编写,利用Go语言的跨平台特性,支持不同操作系统;
Go语言编写的安全壳的源文件应由上述加密后自动生成的;
其中文件里面应该有读取license文件并进行解密,提取授权信息;
其中文件里面应该写入解密密钥、licenses授权校验算法;
其中文件里面启动Java程序的逻辑应该包含向Java传入解密密钥、license授权校验算法、license信息;
安全壳启动时禁止java agent跟随Java进程启动而启动。
5.如权利要求1所述的一种Java应用程序的安全保护方法,其特征在于,所述步骤2.5)包括如下内容:
充分利用Java字节码增强技术,向已有的程序逻辑中动态写入license授权校验算法;
随机写入license授权校验算法,与下一次重启后的字节码完全不一样,从而实现破解者利用agent attach api无法定位和破解license授权校验。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110038384.6A CN112733094A (zh) | 2021-01-12 | 2021-01-12 | 一种Java应用程序的安全保护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110038384.6A CN112733094A (zh) | 2021-01-12 | 2021-01-12 | 一种Java应用程序的安全保护方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112733094A true CN112733094A (zh) | 2021-04-30 |
Family
ID=75590605
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110038384.6A Pending CN112733094A (zh) | 2021-01-12 | 2021-01-12 | 一种Java应用程序的安全保护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112733094A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113238762A (zh) * | 2021-05-10 | 2021-08-10 | 深圳前海微众银行股份有限公司 | java应用远程部署方法、装置及设备 |
CN114090965A (zh) * | 2021-11-22 | 2022-02-25 | 全景智联(武汉)科技有限公司 | java代码混淆方法、系统、计算机设备及存储介质 |
-
2021
- 2021-01-12 CN CN202110038384.6A patent/CN112733094A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113238762A (zh) * | 2021-05-10 | 2021-08-10 | 深圳前海微众银行股份有限公司 | java应用远程部署方法、装置及设备 |
CN113238762B (zh) * | 2021-05-10 | 2024-07-02 | 深圳前海微众银行股份有限公司 | java应用远程部署方法、装置及设备 |
CN114090965A (zh) * | 2021-11-22 | 2022-02-25 | 全景智联(武汉)科技有限公司 | java代码混淆方法、系统、计算机设备及存储介质 |
CN114090965B (zh) * | 2021-11-22 | 2024-05-17 | 全景智联(武汉)科技有限公司 | java代码混淆方法、系统、计算机设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101471589B1 (ko) | 공통중간언어 기반 프로그램을 위한 보안 제공 방법 | |
CN106778103B (zh) | 一种安卓应用程序防逆向破解的加固方法、系统及解密方法 | |
KR100946042B1 (ko) | 탬퍼-레지스턴트 애플리케이션 구동 방법 및 시스템과 컴퓨터 판독 가능 저장 매체 | |
US7254586B2 (en) | Secure and opaque type library providing secure data protection of variables | |
CN102346834A (zh) | Java应用软件加密保护的方法 | |
CN106650341A (zh) | 基于smali流程混淆技术的Android应用加固方法 | |
JP2013511077A (ja) | 悪意ある実行環境内での静的および動的攻撃からJavaバイトコードを保護するシステムおよび方法 | |
CN107430650B (zh) | 保护计算机程序以抵御逆向工程 | |
KR20080020952A (ko) | 정보 처리 시스템 및 프로그램 | |
CN102576391A (zh) | 嵌入在shell代码中的软件许可 | |
CN103745141A (zh) | 智能终端android系统中防止应用程序反编译的方法 | |
CN101957903A (zh) | 一种保护类文件的方法和装置 | |
Götzfried et al. | Soteria: Offline software protection within low-cost embedded devices | |
CN112733094A (zh) | 一种Java应用程序的安全保护方法 | |
CN101944042A (zh) | 一种Java程序的运行方法及电子终端 | |
CN103971034A (zh) | 一种保护Java软件的方法及装置 | |
CN112613037A (zh) | 一种代码校验方法及装置 | |
CN114692134A (zh) | 一种基于linux内核进程监控来保护代码及数据的系统和方法 | |
CN106203002B (zh) | 软件产品保护方法 | |
CN107180170A (zh) | 一种Android APP无壳加固方法 | |
CN112395563A (zh) | 软件产品加密的方法、装置、存储介质及处理器 | |
Bove | Secure Services for Standard RISC-V Architectures | |
CN115129361B (zh) | 一种Java应用程序的安全加固方法及系统 | |
CN112685697B (zh) | 一种防止安卓应用被破解篡改的方法及终端 | |
CN114943062B (zh) | 数据处理方法、装置、电子设备及计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |