CN111680272B - 一种字节码加密和解密方法及装置 - Google Patents
一种字节码加密和解密方法及装置 Download PDFInfo
- Publication number
- CN111680272B CN111680272B CN202010507117.4A CN202010507117A CN111680272B CN 111680272 B CN111680272 B CN 111680272B CN 202010507117 A CN202010507117 A CN 202010507117A CN 111680272 B CN111680272 B CN 111680272B
- Authority
- CN
- China
- Prior art keywords
- byte code
- encrypted
- function
- code segment
- file
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; 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/121—Restricting unauthorised execution of programs
- G06F21/125—Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/62—Protecting access to data via a platform, e.g. using keys or access control rules
- G06F21/6218—Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/21—Indexing scheme relating to G06F21/00 and subgroups addressing additional information or applications relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/2107—File encryption
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Technology Law (AREA)
- Multimedia (AREA)
- Databases & Information Systems (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种字节码加密和解密方法及装置,其中字节码加密方法为:确定源代码文件中具有加密注解的各函数;根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段;所述字节码文件是对所述源代码文件进行编译后得到的;从所述各函数的字节码段中确定待加密的字节码段;对所述待加密的字节码段加密。上述方法应用于金融科技(Fintech)时,只对所述各待加密的字节码段加密,从而缩短了源代码文件的加密时间。
Description
技术领域
本发明涉及金融科技(Fintech)领域中的计算机软件领域,尤其涉及一种字节码加密和解密方法及装置。
背景技术
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。金融机构的开发者都可以基于自身编程软件开发出各种功能。不同开发者之间可能会互相借用已开发的功能。举例来说,开发者A开发出了a功能,开发者B得知后也要用a功能。开发者A可以将a功能的相应源代码编译为字节码交给开发者B直接链接、运行。然而,源代码的原始开发者A不希望源代码的使用者B知悉该功能的具体实现逻辑,如此以来,开发者为了防止使用者反编译出源代码,便有了对字节码加密的需求。
目前软件开发一般是基于面向对象程序设计思想。面向对象程序设计具有封装性,会将每一个对象的属性以及其操作该对象的行为的程序代码组装到一起,一并封装在一个“模块”中,也就是一个类,一般一个完整的类写在一个单独文件中。目前的字节码加密方法中,无论是通过自定义ClassLoader,通过JNI调用本地库还是通过加壳保护对字节码内容的加密,开发者均在相应功能的源代码编译后,直接对整个源代码文件的编译后的字节码内容进行加密,这会导致一些较大的源代码文件,如较大类的源代码文件加密时间过长,这是一个亟待解决的问题。
发明内容
本发明提供一种字节码加密和解密方法及装置,解决了现有技术中源代码文件加密时间过长的问题。
第一方面,本发明提供一种字节码加密方法,包括:确定源代码文件中具有加密注解的各函数;根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段;所述字节码文件是对所述源代码文件进行编译后得到的;从所述各函数的字节码段中确定待加密的字节码段;对所述待加密的字节码段加密。
上述方法中,源代码文件中并不一定是所有的函数都需要加密,上述方法中,首先确定源代码文件中添加了加密注解的各函数,各函数可以为源代码文件中的部分函数,那么只需要根据字节码的数据结构中各部分的偏移量及长度,确定所述各函数在所述源代码文件编译后得到的字节码文件中对应的各字节码段,并且确定所述各字节码段中待加密的字节码段,因此在加密时,可以只对所述待加密的字节码段加密,从而缩短了源代码文件的加密时间。
可选的,所述字节码文件中包括常量池和方法集合;所述方法集合包括每个函数的方法名索引及描述名索引;所述从所述各函数的字节码段中确定待加密的字节码段,包括:针对任一函数,将所述函数的方法名索引及描述名索引在所述字节码文件的常量池中对应的常量属性,作为所述函数的字节码段的常量属性;若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段。
上述方法中,若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段;从而通过常量池和方法集合对函数进行验证,增加了确定待加密的字节码段的准确性。
可选的,所述各函数的加密注解中均指定了配置文件的生效版本号;所述从所述各函数的字节码段中确定待加密的字节码段,包括:加载至少一个配置文件;其中,每个配置文件均与一个生效版本号唯一映射,且每个配置文件中均指定了待加密的函数;针对任一函数,若所述函数的加密注解中生效版本号所对应的配置文件中指定了所述函数为待加密的函数,则将所述函数的字节码段确定为待加密的字节码段。
上述方法中,配置文件和函数的加密注解中均有指定的版本号,可以通过二者版本号的匹配情况来确定函数是否为待加密的函数,从而可以通过配置文件和函数的加密注解来灵活地确定待加密的函数,并进一步地提升确定待加密的字节码段的灵活性。
可选的,所述对所述待加密的字节码段加密之后,还包括:根据字节码的数据结构中各部分的偏移量及长度,生成所述待加密的字节码段加密后已加密的字节码段的位置信息;所述位置信息中指示了所述已加密的字节码段的偏移量及长度。
上述方式下,对所述待加密的字节码段加密之后,生成指示所述已加密的字节码段的偏移量及长度的位置信息,从而直接将已加密的字节码段的偏移量及长度记录。
可选的,所述对所述待加密的字节码段加密,包括:基于编程软件外部引用的方法密钥,对所述待加密的字节码段加密;所述对所述待加密的字节码段加密之后,还包括:通过所述编程软件的内嵌秘钥加密所述方法密钥,获得加密证书;所述加密证书用于解密者使用所述编程软件时,根据所述编程软件中的所述内嵌秘钥获得所述方法密钥。
上述方式下,基于编程软件外部引用的方法密钥,对所述待加密的字节码段加密,另外,还生成了加密证书,如果解密者也使用了相同的所述编程软件,便能根据所述编程软件中的所述内嵌秘钥获得所述方法密钥,从而进一步增加所述待加密的字节码段的加密安全性。
可选的,所述源代码文件为Java源代码文件;所述字节码文件为Java字节码文件。
第二方面,本发明提供一种字节码解密方法,包括:获取待解密的字节码文件;所述待解密的字节码文件是对源代码文件编译后的字节码文件中待加密的字节码段加密得到的;确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段;对所述已加密的字节码段解密。
上述方法下,所述待解密的字节码文件是对源代码文件编译后的字节码文件中待加密的字节码段加密得到的,其中已加密的部分只有所述待加密的字节码段对应的已加密的字节码段,因此只需要对所述已加密的字节码段解密,从而减小了待解密的字节码文件的解密时间。
可选的,所述待解密的字节码文件中还包括所述已加密的字节码段的位置信息,所述位置信息中指示了所述已加密的字节码段的偏移量及长度,所述确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段,包括:根据所述已加密的字节码段的偏移量及长度,确定所述待解密的字节码文件中所述已加密的字节码段。
上述方式下,所述待解密的字节码文件中还包括所述已加密的字节码段的位置信息,能够直接指示出所述已加密的字节码段的偏移量及长度,因此可以直接根据所述已加密的字节码段的偏移量及长度,确定所述待解密的字节码文件中所述已加密的字节码段,从而缩短了确定所述已加密的字节码段的时间。
可选的,所述已加密的字节码段是基于编程软件外部引用的方法密钥加密的;所述对所述已加密的字节码段解密之前;还包括:获取加密证书;所述加密证书是通过所述编程软件的内嵌秘钥加密所述方法密钥获得的;根据所述内嵌秘钥和所述加密证书,获得所述方法密钥;所述对所述已加密的字节码段解密,包括:通过所述方法密钥对所述已加密的字节码段解密。
上述方式下,所述已加密的字节码段是基于编程软件外部引用的方法密钥加密的,并不是基于所述编程软件的内嵌秘钥加密的,对使用所述编程软件并不直接可见,且通过获取加密证书来间接获得所述方法密钥后,才能通过所述方法密钥对所述已加密的字节码段解密,因此增加了解密安全性。
第三方面,本发明提供一种字节码加密装置,包括:确定模块,用于确定源代码文件中具有加密注解的各函数;根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段;所述字节码文件是对所述源代码文件进行编译后得到的;从所述各函数的字节码段中确定待加密的字节码段;加密模块,对所述待加密的字节码段加密。
可选的,所述字节码文件中包括常量池和方法集合;所述方法集合包括每个函数的方法名索引及描述名索引;所述确定模块具体用于:针对任一函数,将所述函数的方法名索引及描述名索引在所述字节码文件的常量池中对应的常量属性,作为所述函数的字节码段的常量属性;若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段。
可选的,所述各函数的加密注解中均指定了配置文件的生效版本号;所述确定模块具体用于:加载至少一个配置文件;其中,每个配置文件均与一个生效版本号唯一映射,且每个配置文件中均指定了待加密的函数;针对任一函数,若所述函数的加密注解中生效版本号所对应的配置文件中指定了所述函数为待加密的函数,则将所述函数的字节码段确定为待加密的字节码段。
可选的,所述加密模块还用于:根据字节码的数据结构中各部分的偏移量及长度,生成所述待加密的字节码段加密后已加密的字节码段的位置信息;所述位置信息中指示了所述已加密的字节码段的偏移量及长度。
可选的,所述加密模块具体用于:基于编程软件外部引用的方法密钥,对所述待加密的字节码段加密;所述加密模块还用于:通过所述编程软件的内嵌秘钥加密所述方法密钥,获得加密证书;所述加密证书用于解密者使用所述编程软件时,根据所述编程软件中的所述内嵌秘钥获得所述方法密钥。
可选的,所述源代码文件为Java源代码文件;所述字节码文件为Java字节码文件。
上述第三方面及第三方面各个可选装置的有益效果,可以参考上述第一方面及第一方面各个可选方法的有益效果,这里不再赘述。
第四方面,本发明提供一种字节码加密装置,包括:获取模块,用于获取待解密的字节码文件;所述待解密的字节码文件是对源代码文件编译后的字节码文件中待加密的字节码段加密得到的;解密模块,用于确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段;对所述已加密的字节码段解密。
可选的,所述待解密的字节码文件中还包括所述已加密的字节码段的位置信息,所述位置信息中指示了所述已加密的字节码段的偏移量及长度,所述解密模块具体用于:根据所述已加密的字节码段的偏移量及长度,确定所述待解密的字节码文件中所述已加密的字节码段。
可选的,所述已加密的字节码段是基于编程软件外部引用的方法密钥加密的;所述获取模块还用于:获取加密证书;所述加密证书是通过所述编程软件的内嵌秘钥加密所述方法密钥获得的;根据所述内嵌秘钥和所述加密证书,获得所述方法密钥;所述解密模块具体用于:通过所述方法密钥对所述已加密的字节码段解密。
上述第四方面及第四方面各个可选装置的有益效果,可以参考上述第二方面及第二方面各个可选方法的有益效果,这里不再赘述。
第五方面,本发明提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面或第二方面各个可选的方法。
第六方面,本发明提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面或第二方面各个可选的方法。
附图说明
图1为本申请实施例提供的一种字节码加密方法的步骤流程示意图;
图2为本申请实施例提供的一种字节码段的位置示意图;
图3为本申请实施例提供的一种字节码加密方法的具体步骤示意图;
图4为本申请实施例提供的一种字节码解密方法的具体步骤示意图;
图5为本申请实施例提供的一种字节码加密装置的结构示意图;
图6为本申请实施例提供的一种字节码解密装置的结构示意图。
具体实施方式
为了更好的理解上述技术方案,下面将结合说明书附图及具体的实施方式对上述技术方案进行详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互结合。
下面首先列出本申请中出现的缩略语的释义。
JVM:Java Virtual Machine,Java虚拟机;
JVMTI:JVM Tool Interface,JVM提供的本地编程接口;
JVMTIAgent:使用JVMTI实现的本地加载客户端;
ClassLoader:类加载器,负责加载类的对象;
JNI:Java Native Interface Java本地方法接口;
字节码:一种包含执行程序、由一序列代码或数据对组成的二进制文件。
反编译:将字节码还原成源代码的过程。
在金融机构(银行机构、保险机构或证券机构)在进行业务(如银行的贷款业务、存款业务等)运转过程中,金融机构的开发者都可以基于自身编程软件开发出各种功能。不同开发者之间可能会互相借用已开发的功能,开发者可以将功能的相应源代码编译为字节码交给其它开发者直接链接、运行。但每个开发者为了保护自己的软件版权,为了防止使用者反编译出源代码,便有了对字节码加密的需求。目前的字节码加密方法中,开发者均在相应功能的源代码编译后,直接对整个源代码文件的编译后的字节码内容进行加密,导致一些较大的源代码文件加密时间过长。这种情况不符合银行等金融机构的需求,无法保证金融机构各项业务的高效运转。为此,如图1所示,本申请提供了一种字节码加密方法。
步骤101:确定源代码文件中具有加密注解的各函数。
步骤102:根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段。
所述字节码文件是对所述源代码文件进行编译后得到的。
步骤103:从所述各函数的字节码段中确定待加密的字节码段。
步骤104:对所述待加密的字节码段加密。
步骤101~步骤104中的所述源代码文件并不限制具体的编程语言和编程软件,举例来说,所述源代码文件可以为Java源代码文件,相应地,编译后的所述字节码文件为Java字节码文件。另外,源代码文件中具体内容也不做限定,举例来说,源代码文件为一个完整的类,也可以包括多个类。值得一提的是,步骤101~步骤104中具有加密注解的各函数的字节码段未必是最终要加密的字节码段,可以直接将源代码文件中具有加密注解的各函数的各字节码段,作为待加密的字节码段,也可以从具有加密注解的各函数的字节码段中根据一定条件选择出待加密的字节码段。所述方法可以确定具体需要保护的字节码段并加密保护,因此可以做到细分到每个函数的字节码段的细粒度加密功能。举例来说,源代码文件具体为:
其中,@WeEncrypt为加密注解。
需要说明的是,字节码的数据结构是统一的标准,每个源代码文件编译后的字节码都遵循这个标准,具体来说,字节码的数据结构如表1所示:
| 名称 | 说明 | 长度 |
| magic | 魔数 | 4 |
| minor_version | 副版本号 | 2 |
| major_version | 主版本号 | 2 |
| constant_pool_count | 常量池计算器 | 2 |
| constant_pool | 常量池 | n |
| access_flags | 访问标志 | 2 |
| this_class | 类索引 | 2 |
| super_class | 父类索引 | 2 |
| interfaces_count | 接口计数器 | 2 |
| interfaces | 接口索引集合 | n |
| fields_count | 字段个数 | 2 |
| fields | 字段集合 | n |
| methods_count | 方法计数器 | 2 |
| methods | 方法集合 | n |
| attributes_count | 附加属性计数器 | 2 |
| attributes | 附加属性集合 | n |
表1字节码的数据结构
表1中示出了字节码的数据结构,通过各部分的偏移量及长度,可以从字节码文件中定位到具体的数据段(如各函数的各字节码段)。其中,常量池包含了类里声明的全部变量、常量、方法等信息,常量池中每个下标都有对应的常量属性。“方法集合”中的参数可以均通过引用下标引用“常量池”中声明的常量,举例来说。Java源代码文件的应用场景中,JVM通过这种方式将两者关联,生成字节码并执行。具体来说,方法集合的数据结构如表2所示:
| 名称 | 含义 | 长度 |
| access_flags | 访问标志 | 1 |
| name_index | 方法名索引 | 1 |
| descriptor_index | 描述符索引 | 1 |
| attributes_count | 属性计数器 | 1 |
| attributes | 属性集合 | n |
表2方法集合的数据结构
更具体地,属性集合中包含方法集合中的参数,如表3所示,可以获取code属性中的字节码段。
| 名称 | 含义 | 长度 |
| attribute_name_index | 属性名索引 | 2 |
| attribute_length | 属性长度 | 4 |
| max_stack | 栈深度最大值 | 2 |
| max_locals | 局部变量表所需的存续空间 | 2 |
| code_length | 字节码指令长度 | 4 |
| code | 字节码 | code_length |
| exception_table_length | 异常表长度 | 2 |
| exception_table | 异常表 | exception_table_length |
| attributes_count | 属性集合计数器 | 2 |
| attributes | 属性集合 | n |
表3属性集合的数据结构
具体的字节码段的例子如图2所示。
需要说明的是,步骤103的一种可选实施方式中,所述字节码文件中包括常量池和方法集合;所述方法集合包括每个函数的方法名索引及描述名索引;具体步骤103可以按照以下实施方式(以下称为步骤103的实施方式一)执行:
针对任一函数,将所述函数的方法名索引及描述名索引在所述字节码文件的常量池中对应的常量属性,作为所述函数的字节码段的常量属性;若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段。
也就是说,步骤103的实施方式一中的加密条件为函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致。
具体来说,所述函数的字节码段的常量属性中的方法名为public int getI(),描述名为return i,所述函数中的方法名也为public int getI(),描述名也为return i,此时证明字节码编译并没有问题便可以确定为待加密的字节码段。
步骤103的另一种可选实施方式中,所述各函数的加密注解中均指定了配置文件的生效版本号;具体步骤103可以按照以下实施方式(以下称为步骤103的实施方式二)执行:
加载至少一个配置文件;其中,每个配置文件均与一个生效版本号唯一映射,且每个配置文件中均指定了待加密的函数;针对任一函数,若所述函数的加密注解中生效版本号所对应的配置文件中指定了所述函数为待加密的函数,则将所述函数的字节码段确定为待加密的字节码段。
也就是说,步骤103的实施方式二中的加密条件为加密注解中生效版本号所对应的配置文件中指定了所述函数为待加密的函数。举例来说,源代码文件具体为:
上述例子中加密注解中添加了生效版本号,如@WeEncrypt(version="2"),生效版本号为2。
可以通过在不同生效版本号的配置文件中添加要加密的函数,可结合函数的解密注解中的生效版本号,一同指定待加密的字节码段。
具体来说,还可以读取至少一个配置文件,搜索每个配置文件中具有加密注解的函数,获取这些函数的名称、签名、版本信息。生成对应的函数加密配置表,可以以键值对形式存储,其中,键存储版本号,值存储对应的函数加密配置表,如下表所示;
| 键 | 值 |
| 1 | [{“METHOD”:”getValue”,“SIG”:”(I)I;()I”}] |
| 2 | [{“METHOD”:”getI”,“SIG”:”()I”},{“METHOD”:”getJ”,“SIG”:”()I”}] |
表4函数加密配置表
举例来说,源代码文件中具有加密注解的函数为函数1、函数2和函数3。函数1中的生效版本号为1,函数2中的生效版本号为2,函数3中的生效版本号为1。共有两个生效版本号的配置文件,生效版本1的配置文件中指定了函数1、函数2为待加密的函数,那么函数1的字节码段便确定为待加密的字节码段,生效版本2的配置文件中指定了函数2、函数3为待加密的函数,那么函数2的字节码段便确定为待加密的字节码段,但是函数3中指定的生效版本号为1,那么就不将函数3的字节码段确定为待加密的字节码段。
需要说明的是,上述步骤103的各种实施方式可以相互结合,如可以将同时满足步骤103的实施方式一中加密条件和步骤103的实施方式二中加密条件的字节码段,作为待加密的字节码段。
步骤104的一种可选实施方式如下:
基于编程软件外部引用的方法密钥,对所述待加密的字节码段加密。
需要说明的是,所述编程软件有自带的内嵌秘钥,这里不直接使用内嵌秘钥对所述待加密的字节码段加密,而是用编程软件外部引用的方法密钥,对所述待加密的字节码段加密。
基于上述可选实施方式,步骤104之后还可以执行以下步骤:
通过所述编程软件的内嵌秘钥加密所述方法密钥,获得加密证书;所述加密证书用于解密者使用所述编程软件时,根据所述编程软件中的所述内嵌秘钥获得所述方法密钥。
步骤104的另一种可选实施方式中,可以将待加密的字节码文件路径、待加密的字节码的偏移量、待加密的字节码的长度信息、方法秘钥B通过JSON格式序列化,使用内嵌秘钥A进行加密得到证书C。
需要说明的是,加密算法并不做限定,如可以通过数据加密标准(DataEncryption Standard,DES)进行加密,长度不是8的整数倍则用0x00补齐,加密后的字节码段替换原来的待加密的字节码段.
举例来说,内嵌秘钥为A,方法秘钥为B,那么A对B加密便得到了加密证书C。
步骤104之后,一种可选实施方式如下:
根据字节码的数据结构中各部分的偏移量及长度,生成所述待加密的字节码段加密后已加密的字节码段的位置信息;所述位置信息中指示了所述已加密的字节码段的偏移量及长度。
举例来说,如表5所示,按照如下编码规则将已加密的字节码段的位置信息添加在字节码的文件头部。
| 层级关系 | 含义 | 长度 | 内容 |
| 1 | 标识加密文件头 | 4 | be be cf cf |
| 2 | 加密配置个数 | 2 | |
| 2.1 | 偏移 | 4 | |
| 2.2 | 长度 | 4 |
表5已加密的字节码段的位置信息
需要说明的是,标识加密文件头(以下称为字节码文件的文件头部)中的内容用来标记字节码文件为一个需要解密的字节码文件,偏移量为表5中加密后的字节码段的开始位置距离文件头的字节偏移量,长度为原字节码段的字节长度,根据偏移量从小到大写入位置信息中。由于上述操作,在解密过程中,可以直接读取上述位置信息就可以定位到加密的字节码段,不需要重新根据字节码编码规范定位,提高了解密速度。
综上所述,结合以上几种实施方式,以Java源代码文件为例,本申请提供的一种字节码加密方法具体流程图可以如图3。其中,图3中使用内嵌秘钥A加密方法秘钥B,得到的证书C的步骤可换为:将待加密的字节码文件路径、待加密的字节码的偏移量、待加密的字节码的长度信息、方法秘钥B通过JSON格式序列化,使用内嵌秘钥A进行加密得到证书C。
相应地,本申请还提供一种字节码解密方法。
步骤(1):获取待解密的字节码文件。
所述待解密的字节码文件是对源代码文件编译后的字节码文件中待加密的字节码段加密得到的。
步骤(2):确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段。
步骤(3):对所述已加密的字节码段解密。
一种可选实施方式中,所述待解密的字节码文件中还包括所述已加密的字节码段的位置信息,所述位置信息中指示了所述已加密的字节码段的偏移量及长度,步骤(2)具体可以按照以下方式执行:
根据所述已加密的字节码段的偏移量及长度,确定所述待解密的字节码文件中所述已加密的字节码段。
一种可选实施方式中,所述已加密的字节码段是基于编程软件外部引用的方法密钥加密的;步骤(3)之前,可以执行以下步骤:
获取加密证书;所述加密证书是通过所述编程软件的内嵌秘钥加密所述方法密钥获得的;根据所述内嵌秘钥和所述加密证书,获得所述方法密钥。
基于上述步骤,步骤(3)具体可以为:
通过所述方法密钥对所述已加密的字节码段解密。
步骤(3)具体还可以为,通过内嵌秘钥A解密证书C后,获取方法秘钥B和加密源代码文件的完整路径信息,用于在加载过程中判断该源代码文件是否需要进行解密操作,相关的字节码段的偏移和长度数据也通过解密后的证书C获取,不需要解析字节码文件的位置信息,也不需要额外删除这部分位置信息。
上述解密流程的具体实施方式可以参照加密流程的具体实施方式,在此不再赘述。综上所述,以Java源代码文件为例,字节码的解密具体流程可以如图4所示。
步骤(4-1):获取待解密的字节码文件、本地加载客户端、加密证书C。
步骤(4-2):将证书C存放在指定目录,并在JVM启动时根据平台不同,声明启动相应的本地加载客户端(如jvmti agent)。
步骤(4-3):通过jvmti agent使用内嵌秘钥A解密证书C,得到方法秘钥B。
步骤(4-4):上述jvmti agent在加载字节码文件前,检查字节码文件的头部是否为自定义的头部编码,即0xbe be cf cf,如果匹配则判定为经过加密的字节码文件,需要进行解密操作。
步骤(4-5):读取加密函数个数,依次根据每个函数偏移量获取对应的加密字节码段,通过方法秘钥B解密后得到8位长度补齐的源字节码段,根据配置中的长度剔除补齐的0x00数据,得到源字节段,回写至字节码段。
步骤(4-6):删除字节码文件的头部。
步骤(4-7):加载解密后的字节码文件至内存中。
如图5所示,本发明提供一种字节码加密装置,包括:确定模块501,用于确定源代码文件中具有加密注解的各函数;根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段;所述字节码文件是对所述源代码文件进行编译后得到的;从所述各函数的字节码段中确定待加密的字节码段;加密模块502,对所述待加密的字节码段加密。
可选的,所述字节码文件中包括常量池和方法集合;所述方法集合包括每个函数的方法名索引及描述名索引;所述确定模块501具体用于:针对任一函数,将所述函数的方法名索引及描述名索引在所述字节码文件的常量池中对应的常量属性,作为所述函数的字节码段的常量属性;若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段。
可选的,所述各函数的加密注解中均指定了配置文件的生效版本号;所述确定模块501具体用于:加载至少一个配置文件;其中,每个配置文件均与一个生效版本号唯一映射,且每个配置文件中均指定了待加密的函数;针对任一函数,若所述函数的加密注解中生效版本号所对应的配置文件中指定了所述函数为待加密的函数,则将所述函数的字节码段确定为待加密的字节码段。
可选的,所述加密模块502还用于:根据字节码的数据结构中各部分的偏移量及长度,生成所述待加密的字节码段加密后已加密的字节码段的位置信息;所述位置信息中指示了所述已加密的字节码段的偏移量及长度。
可选的,所述加密模块502具体用于:基于编程软件外部引用的方法密钥,对所述待加密的字节码段加密;所述加密模块502还用于:通过所述编程软件的内嵌秘钥加密所述方法密钥,获得加密证书;所述加密证书用于解密者使用所述编程软件时,根据所述编程软件中的所述内嵌秘钥获得所述方法密钥。
可选的,所述源代码文件为Java源代码文件;所述字节码文件为Java字节码文件。
如图6所示,本发明提供一种字节码加密装置,包括:获取模块601,用于获取待解密的字节码文件;所述待解密的字节码文件是对源代码文件编译后的字节码文件中待加密的字节码段加密得到的;解密模块602,用于确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段;对所述已加密的字节码段解密。
可选的,所述待解密的字节码文件中还包括所述已加密的字节码段的位置信息,所述位置信息中指示了所述已加密的字节码段的偏移量及长度,所述解密模块602具体用于:根据所述已加密的字节码段的偏移量及长度,确定所述待解密的字节码文件中所述已加密的字节码段。
可选的,所述已加密的字节码段是基于编程软件外部引用的方法密钥加密的;所述获取模块601还用于:获取加密证书;所述加密证书是通过所述编程软件的内嵌秘钥加密所述方法密钥获得的;根据所述内嵌秘钥和所述加密证书,获得所述方法密钥;所述解密模块602具体用于:通过所述方法密钥对所述已加密的字节码段解密。
本申请实施例提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行本申请实施例提供的一种字节码加密和解密方法及任一可选方法。
本申请实施例提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行本申请实施例提供的一种字节码加密和解密方法及任一可选方法。
最后应说明的是:本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (11)
1.一种字节码加密方法,其特征在于,包括:
确定源代码文件中具有加密注解的各函数;
根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段;所述字节码文件是对所述源代码文件进行编译后得到的;
从所述各函数的字节码段中确定待加密的字节码段;
对所述待加密的字节码段加密;
所述字节码文件中包括常量池和方法集合;所述常量池包含了类里声明的全部变量、常量、方法,常量池中每个下标都有对应的常量属性,所述方法集合包括每个函数的方法名索引及描述名索引,所述从所述各函数的字节码段中确定待加密的字节码段,包括:
针对任一函数,将所述函数的方法名索引及描述名索引在所述字节码文件的常量池中对应的常量属性,作为所述函数的字节码段的常量属性;
若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段。
2.如权利要求1所述的方法,其特征在于,所述各函数的加密注解中均指定了配置文件的生效版本号;所述从所述各函数的字节码段中确定待加密的字节码段,包括:
加载至少一个配置文件;其中,每个配置文件均与一个生效版本号唯一映射,且每个配置文件中均指定了待加密的函数;
针对任一函数,若所述函数的加密注解中生效版本号所对应的配置文件中指定了所述函数为待加密的函数,则将所述函数的字节码段确定为待加密的字节码段。
3.如权利要求1所述的方法,其特征在于,所述对所述待加密的字节码段加密之后,还包括:
根据字节码的数据结构中各部分的偏移量及长度,生成所述待加密的字节码段加密后已加密的字节码段的位置信息;所述位置信息中指示了所述已加密的字节码段的偏移量及长度。
4.如权利要求1至3任一项所述的方法,其特征在于,所述对所述待加密的字节码段加密,包括:
基于编程软件外部引用的方法密钥,对所述待加密的字节码段加密;
所述对所述待加密的字节码段加密之后,还包括:
通过所述编程软件的内嵌秘钥加密所述方法密钥,获得加密证书;所述加密证书用于解密者使用所述编程软件时,根据所述编程软件中的所述内嵌秘钥获得所述方法密钥。
5.如权利要求1至3任一项所述的方法,其特征在于,所述源代码文件为Java源代码文件;所述字节码文件为Java字节码文件。
6.一种字节码解密方法,其特征在于,包括:
获取待解密的字节码文件;所述待解密的字节码文件是对源代码文件编译后的字节码文件中待加密的字节码段加密得到的,待加密的字节码段加密是通过权利要求1中字节码加密方法进行加密的;
确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段;
对所述已加密的字节码段解密;
所述字节码文件中包括常量池和方法集合;所述常量池包含了类里声明的全部变量、常量、方法,常量池中每个下标都有对应的常量属性,所述方法集合包括每个函数的方法名索引及描述名索引。
7.如权利要求6所述的方法,其特征在于,所述待解密的字节码文件中还包括所述已加密的字节码段的位置信息,所述位置信息中指示了所述已加密的字节码段的偏移量及长度,所述确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段,包括:
根据所述已加密的字节码段的偏移量及长度,确定所述待解密的字节码文件中所述已加密的字节码段。
8.如权利要求6或7所述的方法,其特征在于,所述已加密的字节码段是基于编程软件外部引用的方法密钥加密的;所述对所述已加密的字节码段解密之前;还包括:
获取加密证书;所述加密证书是通过所述编程软件的内嵌秘钥加密所述方法密钥获得的;
根据所述内嵌秘钥和所述加密证书,获得所述方法密钥;
所述对所述已加密的字节码段解密,包括:
通过所述方法密钥对所述已加密的字节码段解密。
9.一种字节码加密装置,其特征在于,包括:
确定模块,用于确定源代码文件中具有加密注解的各函数;根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段;所述字节码文件是对所述源代码文件进行编译后得到的;从所述各函数的字节码段中确定待加密的字节码段;
加密模块,对所述待加密的字节码段加密;
所述字节码文件中包括常量池和方法集合;所述常量池包含了类里声明的全部变量、常量、方法,常量池中每个下标都有对应的常量属性,所述方法集合包括每个函数的方法名索引及描述名索引,所述从所述各函数的字节码段中确定待加密的字节码段,包括:
针对任一函数,将所述函数的方法名索引及描述名索引在所述字节码文件的常量池中对应的常量属性,作为所述函数的字节码段的常量属性;
若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段。
10.一种计算机设备,其特征在于,包括程序或指令,当所述程序或指令被执行时,如权利要求1至5或6至8中任意一项所述的方法被执行。
11.一种存储介质,其特征在于,包括程序或指令,当所述程序或指令被执行时,如权利要求1至5或6至8中任意一项所述的方法被执行。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202010507117.4A CN111680272B (zh) | 2020-06-05 | 2020-06-05 | 一种字节码加密和解密方法及装置 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202010507117.4A CN111680272B (zh) | 2020-06-05 | 2020-06-05 | 一种字节码加密和解密方法及装置 |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| CN111680272A CN111680272A (zh) | 2020-09-18 |
| CN111680272B true CN111680272B (zh) | 2025-03-18 |
Family
ID=72435054
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202010507117.4A Active CN111680272B (zh) | 2020-06-05 | 2020-06-05 | 一种字节码加密和解密方法及装置 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN111680272B (zh) |
Families Citing this family (5)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN112241519A (zh) * | 2020-11-05 | 2021-01-19 | 王志平 | 一种软件版权保护的实现方法 |
| CN112417380B (zh) * | 2020-11-24 | 2024-05-17 | 广州华资软件技术有限公司 | 一种基于编译技术的Licence管理系统 |
| CN112613071A (zh) * | 2020-12-25 | 2021-04-06 | 武汉市多比特信息科技有限公司 | 一种文件的加密方法、装置及存储介质 |
| CN113868603B (zh) * | 2021-09-26 | 2025-09-12 | 上海浦东发展银行股份有限公司 | 一种保护方法、装置、设备及存储介质 |
| CN117932648B (zh) * | 2024-03-20 | 2024-06-04 | 厦门星纵数字科技有限公司 | 一种字节码保护方法、终端设备及存储介质 |
Citations (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN108037926A (zh) * | 2017-12-26 | 2018-05-15 | 网易(杭州)网络有限公司 | 字节码的优化方法、装置、存储介质、处理器及终端 |
| CN111159662A (zh) * | 2019-12-25 | 2020-05-15 | 郑州阿帕斯数云信息科技有限公司 | 一种数据的处理方法和装置 |
Family Cites Families (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN108829396B (zh) * | 2018-06-15 | 2022-02-01 | 腾讯科技(深圳)有限公司 | 脚本编译的方法、脚本执行的方法、相关装置及系统 |
| CN109101237A (zh) * | 2018-08-01 | 2018-12-28 | 北京顶象技术有限公司 | 代码的加密编译方法及装置 |
-
2020
- 2020-06-05 CN CN202010507117.4A patent/CN111680272B/zh active Active
Patent Citations (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN108037926A (zh) * | 2017-12-26 | 2018-05-15 | 网易(杭州)网络有限公司 | 字节码的优化方法、装置、存储介质、处理器及终端 |
| CN111159662A (zh) * | 2019-12-25 | 2020-05-15 | 郑州阿帕斯数云信息科技有限公司 | 一种数据的处理方法和装置 |
Also Published As
| Publication number | Publication date |
|---|---|
| CN111680272A (zh) | 2020-09-18 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| CN111680272B (zh) | 一种字节码加密和解密方法及装置 | |
| US20160364707A1 (en) | Potentate: A Cryptography-Obfuscating, Self-Policing, Pervasive Distribution System For Digital Content | |
| US9350547B2 (en) | Systems and methods for watermarking software and other media | |
| Collberg et al. | Dynamic graph-based software fingerprinting | |
| US20070266382A1 (en) | System and method for verifying the integrity of read-only components in deployed mixed-mode applications | |
| US10311217B2 (en) | Application piracy prevention with secure enclave protection of automatically modularized functions | |
| Collberg et al. | More on graph theoretic software watermarks: Implementation, analysis, and attacks | |
| Demsky | Cross-application data provenance and policy enforcement | |
| Ahman et al. | Recalling a witness: foundations and applications of monotonic state | |
| James Stephen et al. | Program analysis for secure big data processing | |
| CN110113151A (zh) | 一种对elf格式程序的非侵入式实时加解密方法 | |
| CN116611032A (zh) | 一种jar包中嵌入和提取软件水印的方法、系统和存储介质 | |
| CN110309630A (zh) | 一种Java代码加密方法及装置 | |
| CN101739525B (zh) | 安全校验的方法、编译装置、可运行.net程 序的装置和系统 | |
| CN120012055A (zh) | 基于暗水印的文档溯源方法、装置、计算机设备及介质 | |
| JP2886969B2 (ja) | プログラム変換方法 | |
| CN107533614A (zh) | 使用语义关系修改数据元素 | |
| Park et al. | Detecting common modules in Java packages based on static object trace birthmark | |
| CN109543433B (zh) | 软件开发工具包加密方法、装置、计算机和存储介质 | |
| CN114444028B (zh) | 提升代码安全性的方法、装置、计算机设备和存储介质 | |
| Breß et al. | Forensics on GPU coprocessing in databases-research challenges, first experiments, countermeasures | |
| Otsuki et al. | Overcoming the obfuscation method of the dynamic name resolution | |
| CN112860306B (zh) | 文件生成方法和装置、文件运行方法和装置、电子设备 | |
| CN112052462B (zh) | 一种虚拟化加密方法、终端及存储介质 | |
| CN118194252B (zh) | 一种Windows内核驱动程序的保护方法和装置 |
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 | ||
| GR01 | Patent grant | ||
| GR01 | Patent grant |