一种Java应用程序加密方法及装置与流程

文档序号:21102775发布日期:2020-06-16 20:58阅读:240来源:国知局
一种Java应用程序加密方法及装置与流程

本申请涉及电子技术领域,尤其涉及一种java应用程序加密方法及装置。



背景技术:

java是sun公司推出的能够跨越多平台、可移植性最高的一种面向对象的编程语言,也是截至目前应用最广、特征最丰富、功能最强大的计算机语言。利用java可以编写基于不同平台,不同系统的各式应用程序,从而使其成为应用范围最广泛的开发语言,特别是在虚拟机程序开发方面。

java开发技术在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的特性,运行程序的物理机器环境各不相同,而java虚拟机则在不同运行环境上面建立了统一的运行平台,实现了在任意一台虚拟机上编译的程序都能在其他虚拟机上运行。这一灵活性的编译特性的关键在于,java编译器的输出不是可执行代码,而是字节码。字节码是高度优化的指令集合,这些指令由java运行时系统(通常所谓的虚拟机)执行。由于字节码文件不是真正的二进制文件,而是一种符合java虚拟机规范格式的中间代码,其中保留了大量java应用程序的信息,这给反编译提供了条件和基础。基于java程序中中间代码的特性,反编译出的代码具有很高的可读性和逻辑性,所以导致现有java应用程序安全性差,重要算法和数据存在泄漏,毫无保密性可言的技术问题。



技术实现要素:

本申请提供一种java应用程序加密方法及装置,用以解决现有技术中java应用程序安全性差,重要算法和数据存在泄漏的技术问题。

第一方面,本申请实施例提供一种java应用程序加密方法,包括:

确定待加密的java应用程序的常量池中的第一tag值序列,对所述第一tag值序列中的tag值进行重新排序得到tag值排序不同的多个第二tag值序列;

将所述多个第二tag值序列替换所述第一tag值序列,形成加密的java应用程序。

本申请实施例所提供的方法,根据java字节码的特点,对常量池的修改达到干扰其余集合数据的目的(即实现对java应用程序的加密保护)。常量池中的数据结构遵循java虚拟机规范,不同的常量tag值代表不同类型的常量数据结构,重定义的常量tag值可以达到干扰字节码文件其余数据结构调用常量的目的,修改后的常量被字节码文件中的其余集合调用后会出现数据格式不符、越界等错误,具有干扰反编译的功能。

在一种可选的实施方式中,该方法还包括:

将所述第一tag值序列与所述多个第二tag值序列的映射关系写入授权文件;使得所述加密的java应用程序在虚拟机中加载时从授权文件中读取所述映射关系将多个第二tag值序列替换成所述第一tag值序列。

该实例中,将字节码中原始常量池中tag值序列中tag值的顺序调整得到多个新的tag值序列,并且保存新tag值序列与原始tag值序列之间的映射关系,在保证非授权用户不能反编译字节码的情况下,授权用户根据该映射关系可以获得正确的tag值序列对字节码进行正常读取。

在一种可选的实施方式中,所述将所述多个第二tag值序列替换所述第一tag值序列包括:

采用高级加密标准aes对所述多个第二tag值序列进行加密;

将加密后的所述多个第二tag值序列替换所述第一tag值序列。

该实施例中在改变tag值序列中tag值顺序的情况下,还对常量池进行加密,进一步防止字节码被反编译,提高java应用程序的安全性。

在一种可选的实施方式中,所述采用高级加密标准aes对所述多个第二tag值序列进行加密包括:

获取所述java应用程序运行环境的机器码,并基于所述机器码得到多个不同的干扰码和aes加密算法的密钥;

利用所述多个干扰码、机器码和aes加密算法的密钥对所述多个第二tag值序列进行加密。

第二方面,提供一种java应用程序加密装置,包括:

排序模块,用于确定待加密的java应用程序的常量池中的第一tag值序列,对所述第一tag值序列中的tag值进行重新排序得到tag值排序不同的多个第二tag值序列;

加密模块,用于将所述多个第二tag值序列替换所述第一tag值序列,形成加密的java应用程序。

在一种可选的实施方式中,该装置还可以包括:

写入模块,用于将所述第一tag值序列与所述多个第二tag值序列的映射关系写入授权文件;使得所述加密的java应用程序在虚拟机中加载时从授权文件中读取所述映射关系将多个第二tag值序列替换成所述第一tag值序列。

在一种可选的实施方式中,该加密模块还用于采用高级加密标准aes对所述多个第二tag值序列进行加密;将加密后的所述多个第二tag值序列替换所述第一tag值序列。

在一种可选的实施方式中,该加密模块还用于获取所述java应用程序运行环境的机器码,并基于所述机器码得到多个不同的干扰码和aes加密算法的密钥;利用所述多个干扰码、机器码和aes加密算法的密钥对所述多个第二tag值序列进行加密。

第三方面,本申请实施例还提供一种java应用程序加密装置,包括:

存储器,用于存储处理器所执行的指令;

处理器,用于执行存储器中存储的指令执行第一方面中任一可选的实施方式所述的方法。

第四方面,本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,当所述计算机指令在计算机上运行时,使得计算机执行第一方面中任一可选的实施方式所述的方法。

附图说明

图1为本申请实施例提供的一种java应用程序加密方法的流程示意图;

图2为加密常量池前的字节码示意图;

图3为应用本申请实施例所提供方法对常量池加密后的字节码示意图;

图4为本申请实施例提供的一种java应用程序加密装置示意图;

图5为本申请实施例提供的另外一种java应用程序加密装置示意图。

具体实施方式

由于java虚拟机编译出的字节码文件数据格式严格遵守java虚拟机规范,逆向工程可以通过对字节码文件数据格式的分析逆向推导出程序源码,对此,现有技术从不同维度提出了多种针对java应用程序的保护方法,主要有:本地化技术、远程接口访问技术和混淆技术。但是这些技术都存在一些问题,具体是:

一,本地化技术:该技术是指首先编写java源码,然后通过java编译器将java源代码编译为class文件或构建为jar包,最后使用本地化工具将class或jar文件编译成二进制的本机应用程序。但是java本地化技术产生的是二进制格式的可执行文件,所以会导致java应用程序失去了“一次编译,到处运行”的跨平台性、无法应用于b/s结构的网络应用程序和错误定位困难,尤其当java类文件版本中没有发生该错误的时候。

二,远程接口访问技术:现代程序开发中广泛采用的分布式结构体系,通常将客户端和服务端分离,核心的功能模块和业务流程部署在服务端,客户端通过数据采集、提交服务请求与服务端通信。这种体系结构可以提高系统的可移植性和互操作性,大幅度降低程序的开发成本。但是,也正是由于该方案利用分布式技术将核心代码部署在独立服务器中,用户无法接触到核心代码,这种方案存在,一旦服务器通过其他途径和方法被攻破,部署在服务器端的核心代码和用户数据将全部暴露隐患,造成更大的损失。且这种技术只适用于有联网需求的程序,无法应用于单机版应用程序。

三,代码混淆技术,该技术是对类文件进行代码语义、程序流程和逻辑结构的重新组织,代码混淆并不能增加反编译的难度,使用反编译器仍然可以对混淆后的类文件进行反编译,得到代码,但此时的代码是经混淆后的代码,可读性己大大降低,难以从代码中发现源代码的编写思路和关键算法,从而达到保护应用程序的目的。但是,被混淆过的字节码文件仍然可以被成功反编译,无法从根本上解决java应用程序保护的问题。

根据上述现有技术所提供的解决方案不难发现,现有技术中所提供的java应用程序保护方法各自都存在一定的问题,为了在保证java应用程序本身优势的前提下,本申请实施例提供一种可以所有java应用程序通用的java应用程序保护方法。本申请实施例所提供java应用程序加密方法的总体思路为:

确定待加密的java应用程序的常量池中的第一tag值序列,对所述第一tag值序列中的tag值进行重新排序得到tag值排序不同的多个第二tag值序列;

将所述多个第二tag值序列替换所述第一tag值序列,形成加密的java应用程序。

本申请实施例提供的方法,通过对常量tag值的重定义有效的保护常量池数据的安全性,从而保护整个字节码文件不被反编译,显著提升了应用程序的安全性。

由于java字节码文件中的索引集合、字段表集合、方法表集合、属性表集合中都存在对java应用程序的常量池中常量的引用,所以本申请实施例中根据java字节码的该特点,基于对常量池的修改达到干扰其余集合数据的目的(即实现对java应用程序的加密保护)。常量池中的数据结构遵循java虚拟机规范,不同的常量tag值代表不同类型的常量数据结构,重定义的常量tag值可以达到干扰字节码文件其余数据结构调用常量的目的,修改后的常量被字节码文件中的其余集合调用后会出现数据格式不符、越界等错误,具有干扰反编译的功能。如图1所示,为了更清楚详细的说明本申请实施例所提供的方法,以下结合具体的实例、附图和具体的应用场景对本申请实施例提供的一种java应用程序加密方法做进一步详细的说明:

步骤101,确定待加密的java应用程序的常量池中的第一tag值序列,对所述第一tag值序列中的tag值进行重新排序得到tag值排序不同的多个第二tag值序列;

一些情况下该常量池中的tag值序列(即第一tag值序列)可以是从1至12(2为保留值)共11个值,由于tag值序列在字节码文件中占据一个字节,因此该对tag值序列中的tag值重新排序后,可以有255个tag值排序不同的多个第二tag值序列,重新排序后可能会出现的组合为

步骤102,将所述多个第二tag值序列替换所述第一tag值序列,形成加密的java应用程序。

在该实施例中,第二tag值序列是重新排序得到,所以java虚拟机编译出的字节码文件数据格式即使严格遵守java虚拟机规范,但是逆向工程如果基于原始常量池的tag值序列对字节码文件数据格式的分析逆向推导时并不能得到程序源码,因此本申请实施例所提供的方法可以通过简单的方式提高java应用程序的安全性。

基于上述加密方法,为了实现对基于上述方法加密的java应用程序进行解密,则将所述第一tag值序列与所述多个第二tag值序列的映射关系写入授权文件;使得所述加密的java应用程序在虚拟机中加载时从授权文件中读取所述映射关系将多个第二tag值序列替换成所述第一tag值序列。

基于tag序列包括从1至12(2为保留值)共11个值的情况,则重新排序后的t第二tag值序列与第一tag值序列之间的映射关系如公式所示。

f(n)=x,(n=0,1,2,3…255,x=1,3,4,…,12)

对应的,乱序后的序列对应关系为上面公式的反函数即公式:

f-1(x)=n,(n=0,1,2…255,x=1,3,4,…,12)

可选的,打乱tag值顺序在一定程度上增加了逆向破解字节码文件的难度和时间,为了更好的保护常量池,本申请实施例还可以对常量池数据采用aes的二次加密,加密后的常量池数据结构不再具有任何可读性,可更好的保护字节码文件。具体实现可以是所述将所述多个第二tag值序列替换所述第一tag值序列包括:

a1,采用高级加密标准(advancedencryptionstandard,aes)对所述多个第二tag值序列进行加密;

aes加密算法密钥的生成和对字节码文件的加密与java虚拟机无关,因此可采用第三方独立程序实现。具体使用aes加密算法对常量池进行加密可以是,将java应用程序使用者提供的机器码输入aes密钥生成加密器中,生成独立的aes加密密钥并将软件的核心程序(例如常量池)进行加密,对常量池进行加密后,未经授权的java应用程序运行时会提示未经授权的提示消息;在本申请实施例中,采用aes对所述多个第二tag值序列进行加密的具体实现可以是:

b1,获取所述java应用程序运行环境的机器码,并基于所述机器码得到多个不同的干扰码和aes加密算法的密钥;

b2,利用所述多个干扰码、机器码和aes加密算法的密钥对所述多个第二tag值序列进行加密。

该机器码是有java应用程序运行环境的对应的,具体可以是网卡、硬盘编号和cpu编号等,对应该机器码所包括的内容,在机器码输入加密程序之后,可生成3个不同的干扰码和aes加密算法的密钥,将3个干扰码、机器码和aes加密密钥保存到数据库中,便于以后的软件维护和查询。

对常量池数据进行加密(即对第二tag值序列进行加密),采用与软件运行环境机器码相绑定的方式,加密算法采用256位aes加密算法,加密密钥为机器码与md5加密算法相结合。基于上述机器码的实现方式,则对应的aes加密密钥可以是:

密钥=md5(md5(md5(md5(网卡+干扰码1)+硬盘编号+干扰码2)+cpu编号)+干扰码3)

在该实施例中,干扰码由数字、字母和特殊符号组合生成,位数不固定。md5算法的快速性、不可逆性和干扰码的随机性保证了aes加密算法密钥的安全性。

a2,将加密后的所述多个第二tag值序列替换所述第一tag值序列。

为了更清晰的说明本申请实施例所提供方法的效果,提供具体的试验数据进行说明,具体试验结果如图2和3所示;其中,图2为加密常量池前的字节码文件;图3为加密常量池后的字节码文件,图3右边部分的程序内容可以确认,在图2中正常的程序代码,基于本申请实施例所提供的方法对java应用程序的常量池进行加密后,对java应用程序进行反编译并不能得到正确的程序代码,反编译之后得到的是图3右半部分所示的乱码。根据图2和图3字节码文件的解析结果可以确定,采用本申请实施例所提供的方法对java应用程序进行加密,能够有效的降低java应用程序字节码文件的可读性和逻辑性,所以能够有效的提高java应用程序的安全性。

而且,通过本申请实施例所提供方法加密后的常量池数据结构为:常量池长度(u4)+加密后的数据,加密后的常量池长度为432个字节,加密前的常量池长度为415个字节,加密密钥为:5cd43d160a8109377782c1063790bfaa。加密前的常量池数据具有很好的可读性,若字节码文件数据信息量较小,可以很轻松的根据常量池中的数据结合其余集合的数据结构分析出程序的源码,经过加密后的常量池数据失去了可读性和java虚拟机规范的数据结构,在无法获取常量池加密密钥的情况下也无法获取常量池的常量数据,即使可以正确甄别出字节码其余数据结构也无法恢复出程序的源码。

如图4所示,基于上述方法,本申请实施例还提供一种java应用程序加密装置,包括:

排序模块401,用于确定待加密的java应用程序的常量池中的第一tag值序列,对所述第一tag值序列中的tag值进行重新排序得到tag值排序不同的多个第二tag值序列;

加密模块402,用于将所述多个第二tag值序列替换所述第一tag值序列,形成加密的java应用程序。

可选的,还包括:

写入模块403,用于将所述第一tag值序列与所述多个第二tag值序列的映射关系写入授权文件;使得所述加密的java应用程序在虚拟机中加载时从授权文件中读取所述映射关系将多个第二tag值序列替换成所述第一tag值序列。

其中,加密模块402还用于采用高级加密标准aes对所述多个第二tag值序列进行加密;将加密后的所述多个第二tag值序列替换所述第一tag值序列。

可选的,加密模块402还用于获取所述java应用程序运行环境的机器码,并基于所述机器码得到多个不同的干扰码和aes加密算法的密钥;利用所述多个干扰码、机器码和aes加密算法的密钥对所述多个第二tag值序列进行加密。

如图5所示,本发明还提供另一种java应用程序加密装置,用于执行前述各个实施例中的java应用程序加密方法,该装置包括至少一个处理器501(例如cpu),至少一个网络接口502或者其他通信接口,存储器503,和至少一个通信总线504,用于实现这些装置之间的连接通信。处理器501用于执行存储器503中存储的可执行模块,例如计算机程序。存储器503可能包含高速随机存取存储器(ram:randomaccessmemory),也可能还包括非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。通过至少一个网络接口502(可以是有线或者无线)实现该系统网关与至少一个其他网元之间的通信连接,可以使用互联网,广域网,本地网,城域网等。

在一些实施方式中,存储器存储了程序5031,程序可以被处理器执行,实现实图1所描述的方法。

基于同一发明构思,本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,当所述计算机指令在计算机上运行时,使得计算机执行本申请实施例一所述java应用程序加密方法。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1