一种字节码加密和解密方法及装置与流程

文档序号:22256559发布日期:2020-09-18 13:47阅读:169来源:国知局
本发明涉及金融科技(fintech)领域中的计算机软件领域,尤其涉及一种字节码加密和解密方法及装置。
背景技术
::随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(fintech)转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。金融机构的开发者都可以基于自身编程软件开发出各种功能。不同开发者之间可能会互相借用已开发的功能。举例来说,开发者a开发出了a功能,开发者b得知后也要用a功能。开发者a可以将a功能的相应源代码编译为字节码交给开发者b直接链接、运行。然而,源代码的原始开发者a不希望源代码的使用者b知悉该功能的具体实现逻辑,如此以来,开发者为了防止使用者反编译出源代码,便有了对字节码加密的需求。目前软件开发一般是基于面向对象程序设计思想。面向对象程序设计具有封装性,会将每一个对象的属性以及其操作该对象的行为的程序代码组装到一起,一并封装在一个“模块”中,也就是一个类,一般一个完整的类写在一个单独文件中。目前的字节码加密方法中,无论是通过自定义classloader,通过jni调用本地库还是通过加壳保护对字节码内容的加密,开发者均在相应功能的源代码编译后,直接对整个源代码文件的编译后的字节码内容进行加密,这会导致一些较大的源代码文件,如较大类的源代码文件加密时间过长,这是一个亟待解决的问题。技术实现要素:本发明提供一种字节码加密和解密方法及装置,解决了现有技术中源代码文件加密时间过长的问题。第一方面,本发明提供一种字节码加密方法,包括:确定源代码文件中具有加密注解的各函数;根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段;所述字节码文件是对所述源代码文件进行编译后得到的;从所述各函数的字节码段中确定待加密的字节码段;对所述待加密的字节码段加密。上述方法中,源代码文件中并不一定是所有的函数都需要加密,上述方法中,首先确定源代码文件中添加了加密注解的各函数,各函数可以为源代码文件中的部分函数,那么只需要根据字节码的数据结构中各部分的偏移量及长度,确定所述各函数在所述源代码文件编译后得到的字节码文件中对应的各字节码段,并且确定所述各字节码段中待加密的字节码段,因此在加密时,可以只对所述待加密的字节码段加密,从而缩短了源代码文件的加密时间。可选的,所述字节码文件中包括常量池和方法集合;所述方法集合包括每个函数的方法名索引及描述名索引;所述从所述各函数的字节码段中确定待加密的字节码段,包括:针对任一函数,将所述函数的方法名索引及描述名索引在所述字节码文件的常量池中对应的常量属性,作为所述函数的字节码段的常量属性;若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段。上述方法中,若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段;从而通过常量池和方法集合对函数进行验证,增加了确定待加密的字节码段的准确性。可选的,所述各函数的加密注解中均指定了配置文件的生效版本号;所述从所述各函数的字节码段中确定待加密的字节码段,包括:加载至少一个配置文件;其中,每个配置文件均与一个生效版本号唯一映射,且每个配置文件中均指定了待加密的函数;针对任一函数,若所述函数的加密注解中生效版本号所对应的配置文件中指定了所述函数为待加密的函数,则将所述函数的字节码段确定为待加密的字节码段。上述方法中,配置文件和函数的加密注解中均有指定的版本号,可以通过二者版本号的匹配情况来确定函数是否为待加密的函数,从而可以通过配置文件和函数的加密注解来灵活地确定待加密的函数,并进一步地提升确定待加密的字节码段的灵活性。可选的,所述对所述待加密的字节码段加密之后,还包括:根据字节码的数据结构中各部分的偏移量及长度,生成所述待加密的字节码段加密后已加密的字节码段的位置信息;所述位置信息中指示了所述已加密的字节码段的偏移量及长度。上述方式下,对所述待加密的字节码段加密之后,生成指示所述已加密的字节码段的偏移量及长度的位置信息,从而直接将已加密的字节码段的偏移量及长度记录。可选的,所述对所述待加密的字节码段加密,包括:基于编程软件外部引用的方法密钥,对所述待加密的字节码段加密;所述对所述待加密的字节码段加密之后,还包括:通过所述编程软件的内嵌秘钥加密所述方法密钥,获得加密证书;所述加密证书用于解密者使用所述编程软件时,根据所述编程软件中的所述内嵌秘钥获得所述方法密钥。上述方式下,基于编程软件外部引用的方法密钥,对所述待加密的字节码段加密,另外,还生成了加密证书,如果解密者也使用了相同的所述编程软件,便能根据所述编程软件中的所述内嵌秘钥获得所述方法密钥,从而进一步增加所述待加密的字节码段的加密安全性。可选的,所述源代码文件为java源代码文件;所述字节码文件为java字节码文件。第二方面,本发明提供一种字节码解密方法,包括:获取待解密的字节码文件;所述待解密的字节码文件是对源代码文件编译后的字节码文件中待加密的字节码段加密得到的;确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段;对所述已加密的字节码段解密。上述方法下,所述待解密的字节码文件是对源代码文件编译后的字节码文件中待加密的字节码段加密得到的,其中已加密的部分只有所述待加密的字节码段对应的已加密的字节码段,因此只需要对所述已加密的字节码段解密,从而减小了待解密的字节码文件的解密时间。可选的,所述待解密的字节码文件中还包括所述已加密的字节码段的位置信息,所述位置信息中指示了所述已加密的字节码段的偏移量及长度,所述确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段,包括:根据所述已加密的字节码段的偏移量及长度,确定所述待解密的字节码文件中所述已加密的字节码段。上述方式下,所述待解密的字节码文件中还包括所述已加密的字节码段的位置信息,能够直接指示出所述已加密的字节码段的偏移量及长度,因此可以直接根据所述已加密的字节码段的偏移量及长度,确定所述待解密的字节码文件中所述已加密的字节码段,从而缩短了确定所述已加密的字节码段的时间。可选的,所述已加密的字节码段是基于编程软件外部引用的方法密钥加密的;所述对所述已加密的字节码段解密之前;还包括:获取加密证书;所述加密证书是通过所述编程软件的内嵌秘钥加密所述方法密钥获得的;根据所述内嵌秘钥和所述加密证书,获得所述方法密钥;所述对所述已加密的字节码段解密,包括:通过所述方法密钥对所述已加密的字节码段解密。上述方式下,所述已加密的字节码段是基于编程软件外部引用的方法密钥加密的,并不是基于所述编程软件的内嵌秘钥加密的,对使用所述编程软件并不直接可见,且通过获取加密证书来间接获得所述方法密钥后,才能通过所述方法密钥对所述已加密的字节码段解密,因此增加了解密安全性。第三方面,本发明提供一种字节码加密装置,包括:确定模块,用于确定源代码文件中具有加密注解的各函数;根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段;所述字节码文件是对所述源代码文件进行编译后得到的;从所述各函数的字节码段中确定待加密的字节码段;加密模块,对所述待加密的字节码段加密。可选的,所述字节码文件中包括常量池和方法集合;所述方法集合包括每个函数的方法名索引及描述名索引;所述确定模块具体用于:针对任一函数,将所述函数的方法名索引及描述名索引在所述字节码文件的常量池中对应的常量属性,作为所述函数的字节码段的常量属性;若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段。可选的,所述各函数的加密注解中均指定了配置文件的生效版本号;所述确定模块具体用于:加载至少一个配置文件;其中,每个配置文件均与一个生效版本号唯一映射,且每个配置文件中均指定了待加密的函数;针对任一函数,若所述函数的加密注解中生效版本号所对应的配置文件中指定了所述函数为待加密的函数,则将所述函数的字节码段确定为待加密的字节码段。可选的,所述加密模块还用于:根据字节码的数据结构中各部分的偏移量及长度,生成所述待加密的字节码段加密后已加密的字节码段的位置信息;所述位置信息中指示了所述已加密的字节码段的偏移量及长度。可选的,所述加密模块具体用于:基于编程软件外部引用的方法密钥,对所述待加密的字节码段加密;所述加密模块还用于:通过所述编程软件的内嵌秘钥加密所述方法密钥,获得加密证书;所述加密证书用于解密者使用所述编程软件时,根据所述编程软件中的所述内嵌秘钥获得所述方法密钥。可选的,所述源代码文件为java源代码文件;所述字节码文件为java字节码文件。上述第三方面及第三方面各个可选装置的有益效果,可以参考上述第一方面及第一方面各个可选方法的有益效果,这里不再赘述。第四方面,本发明提供一种字节码加密装置,包括:获取模块,用于获取待解密的字节码文件;所述待解密的字节码文件是对源代码文件编译后的字节码文件中待加密的字节码段加密得到的;解密模块,用于确定所述待加密的字节码段在所述待解密的字节码文件中对应的已加密的字节码段;对所述已加密的字节码段解密。可选的,所述待解密的字节码文件中还包括所述已加密的字节码段的位置信息,所述位置信息中指示了所述已加密的字节码段的偏移量及长度,所述解密模块具体用于:根据所述已加密的字节码段的偏移量及长度,确定所述待解密的字节码文件中所述已加密的字节码段。可选的,所述已加密的字节码段是基于编程软件外部引用的方法密钥加密的;所述获取模块还用于:获取加密证书;所述加密证书是通过所述编程软件的内嵌秘钥加密所述方法密钥获得的;根据所述内嵌秘钥和所述加密证书,获得所述方法密钥;所述解密模块具体用于:通过所述方法密钥对所述已加密的字节码段解密。上述第四方面及第四方面各个可选装置的有益效果,可以参考上述第二方面及第二方面各个可选方法的有益效果,这里不再赘述。第五方面,本发明提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面或第二方面各个可选的方法。第六方面,本发明提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面或第二方面各个可选的方法。附图说明图1为本申请实施例提供的一种字节码加密方法的步骤流程示意图;图2为本申请实施例提供的一种字节码段的位置示意图;图3为本申请实施例提供的一种字节码加密方法的具体步骤示意图;图4为本申请实施例提供的一种字节码解密方法的具体步骤示意图;图5为本申请实施例提供的一种字节码加密装置的结构示意图;图6为本申请实施例提供的一种字节码解密装置的结构示意图。具体实施方式为了更好的理解上述技术方案,下面将结合说明书附图及具体的实施方式对上述技术方案进行详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互结合。下面首先列出本申请中出现的缩略语的释义。jvm:javavirtualmachine,java虚拟机;jvmti:jvmtoolinterface,jvm提供的本地编程接口;jvmtiagent:使用jvmti实现的本地加载客户端;classloader:类加载器,负责加载类的对象;jni:javanativeinterfacejava本地方法接口;字节码:一种包含执行程序、由一序列代码或数据对组成的二进制文件。反编译:将字节码还原成源代码的过程。在金融机构(银行机构、保险机构或证券机构)在进行业务(如银行的贷款业务、存款业务等)运转过程中,金融机构的开发者都可以基于自身编程软件开发出各种功能。不同开发者之间可能会互相借用已开发的功能,开发者可以将功能的相应源代码编译为字节码交给其它开发者直接链接、运行。但每个开发者为了保护自己的软件版权,为了防止使用者反编译出源代码,便有了对字节码加密的需求。目前的字节码加密方法中,开发者均在相应功能的源代码编译后,直接对整个源代码文件的编译后的字节码内容进行加密,导致一些较大的源代码文件加密时间过长。这种情况不符合银行等金融机构的需求,无法保证金融机构各项业务的高效运转。为此,如图1所示,本申请提供了一种字节码加密方法。步骤101:确定源代码文件中具有加密注解的各函数。步骤102:根据字节码的数据结构中各部分的偏移量及长度,确定在字节码文件中所述各函数的各字节码段。所述字节码文件是对所述源代码文件进行编译后得到的。步骤103:从所述各函数的字节码段中确定待加密的字节码段。步骤104:对所述待加密的字节码段加密。步骤101~步骤104中的所述源代码文件并不限制具体的编程语言和编程软件,举例来说,所述源代码文件可以为java源代码文件,相应地,编译后的所述字节码文件为java字节码文件。另外,源代码文件中具体内容也不做限定,举例来说,源代码文件为一个完整的类,也可以包括多个类。值得一提的是,步骤101~步骤104中具有加密注解的各函数的字节码段未必是最终要加密的字节码段,可以直接将源代码文件中具有加密注解的各函数的各字节码段,作为待加密的字节码段,也可以从具有加密注解的各函数的字节码段中根据一定条件选择出待加密的字节码段。所述方法可以确定具体需要保护的字节码段并加密保护,因此可以做到细分到每个函数的字节码段的细粒度加密功能。举例来说,源代码文件具体为:其中,@weencrypt为加密注解。需要说明的是,字节码的数据结构是统一的标准,每个源代码文件编译后的字节码都遵循这个标准,具体来说,字节码的数据结构如表1所示:名称说明长度magic魔数4minor_version副版本号2major_version主版本号2constant_pool_count常量池计算器2constant_pool常量池naccess_flags访问标志2this_class类索引2super_class父类索引2interfaces_count接口计数器2interfaces接口索引集合nfields_count字段个数2fields字段集合nmethods_count方法计数器2methods方法集合nattributes_count附加属性计数器2attributes附加属性集合n表1字节码的数据结构表1中示出了字节码的数据结构,通过各部分的偏移量及长度,可以从字节码文件中定位到具体的数据段(如各函数的各字节码段)。其中,常量池包含了类里声明的全部变量、常量、方法等信息,常量池中每个下标都有对应的常量属性。“方法集合”中的参数可以均通过引用下标引用“常量池”中声明的常量,举例来说。java源代码文件的应用场景中,jvm通过这种方式将两者关联,生成字节码并执行。具体来说,方法集合的数据结构如表2所示:名称含义长度access_flags访问标志1name_index方法名索引1descriptor_index描述符索引1attributes_count属性计数器1attributes属性集合n表2方法集合的数据结构更具体地,属性集合中包含方法集合中的参数,如表3所示,可以获取code属性中的字节码段。名称含义长度attribute_name_index属性名索引2attribute_length属性长度4max_stack栈深度最大值2max_locals局部变量表所需的存续空间2code_length字节码指令长度4code字节码code_lengthexception_table_length异常表长度2exception_table异常表exception_table_lengthattributes_count属性集合计数器2attributes属性集合n表3属性集合的数据结构具体的字节码段的例子如图2所示。需要说明的是,步骤103的一种可选实施方式中,所述字节码文件中包括常量池和方法集合;所述方法集合包括每个函数的方法名索引及描述名索引;具体步骤103可以按照以下实施方式(以下称为步骤103的实施方式一)执行:针对任一函数,将所述函数的方法名索引及描述名索引在所述字节码文件的常量池中对应的常量属性,作为所述函数的字节码段的常量属性;若所述函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致,则将所述函数的字节码段确定为待加密的字节码段。也就是说,步骤103的实施方式一中的加密条件为函数的字节码段的常量属性中方法名和描述名与所述函数中方法名和描述名对应一致。具体来说,所述函数的字节码段的常量属性中的方法名为publicintgeti(),描述名为returni,所述函数中的方法名也为publicintgeti(),描述名也为returni,此时证明字节码编译并没有问题便可以确定为待加密的字节码段。步骤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。需要说明的是,加密算法并不做限定,如可以通过数据加密标准(dataencryptionstandard,des)进行加密,长度不是8的整数倍则用0x00补齐,加密后的字节码段替换原来的待加密的字节码段.举例来说,内嵌秘钥为a,方法秘钥为b,那么a对b加密便得到了加密证书c。步骤104之后,一种可选实施方式如下:根据字节码的数据结构中各部分的偏移量及长度,生成所述待加密的字节码段加密后已加密的字节码段的位置信息;所述位置信息中指示了所述已加密的字节码段的偏移量及长度。举例来说,如表5所示,按照如下编码规则将已加密的字节码段的位置信息添加在字节码的文件头部。层级关系含义长度内容1标识加密文件头4bebecfcf2加密配置个数22.1偏移42.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启动时根据平台不同,声明启动相应的本地加载客户端(如jvmtiagent)。步骤(4-3):通过jvmtiagent使用内嵌秘钥a解密证书c,得到方法秘钥b。步骤(4-4):上述jvmtiagent在加载字节码文件前,检查字节码文件的头部是否为自定义的头部编码,即0xbebecfcf,如果匹配则判定为经过加密的字节码文件,需要进行解密操作。步骤(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具体用于:通过所述方法密钥对所述已加密的字节码段解密。本申请实施例提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行本申请实施例提供的一种字节码加密和解密方法及任一可选方法。本申请实施例提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行本申请实施例提供的一种字节码加密和解密方法及任一可选方法。最后应说明的是:本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1