CN114357391A - 数据加、解密方法及计算机存储介质 - Google Patents

数据加、解密方法及计算机存储介质 Download PDF

Info

Publication number
CN114357391A
CN114357391A CN202210039481.1A CN202210039481A CN114357391A CN 114357391 A CN114357391 A CN 114357391A CN 202210039481 A CN202210039481 A CN 202210039481A CN 114357391 A CN114357391 A CN 114357391A
Authority
CN
China
Prior art keywords
syntax tree
code
encrypted
encryption
node
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
Application number
CN202210039481.1A
Other languages
English (en)
Inventor
于子淇
林立翔
游亮
龙欣
张尉东
卓钧亮
戚余航
刘思超
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Alibaba China Co Ltd
Original Assignee
Alibaba China Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Alibaba China Co Ltd filed Critical Alibaba China Co Ltd
Priority to CN202210039481.1A priority Critical patent/CN114357391A/zh
Publication of CN114357391A publication Critical patent/CN114357391A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Storage Device Security (AREA)

Abstract

本申请实施例提供了一种数据加、解密方法及计算机存储介质,其中,数据加密方法包括:获取待加密的动态解释型语言代码及所述代码对应的语法树;对所述语法树进行代码混淆,获得初始加密语法树;对所述初始加密语法树进行针对节点访问的第一加密处理和针对内容访问的第二加密处理,获得再加密语法树;针对所述再加密语法树进行基于语法树的混淆转换处理,获得增强加密语法树;基于所述增强加密语法树,生成所述代码对应的加密代码。通过本申请实施例,极大提升了对动态解释型语言代码的安全保护。

Description

数据加、解密方法及计算机存储介质
技术领域
本申请实施例涉及计算机技术领域,尤其涉及一种数据加、解密方法及计算机存储介质。
背景技术
脚本语言也即动态语言,是一种解释型编程语言,也称动态解释型语言。动态解释型语言用来控制软件应用程序,其脚本通常以文本保存,只在被调用时进行解释或编译。并且,具有动态代码、简化开发和部署、易于集成和使用等特点。
以动态解释型语言中的Python语言为例,其易用性较高,在诸如数据预处理、深度学习领域、科学计算领域、服务器软件等领域都被广泛使用。在此情况下,如何对这一类型的语言进行代码安全保护成为近年来的热门问题。在目前的一种保护方案中,对由该种语言实现的程序代码在代码层级做代码混淆,以进行安全保护。但是,代码混淆无法混淆Python的关键字,所以容易被token词法分析等方式进行混淆解析,或者直接进行静态分析跳过关键步骤,导致无法进行真正的保护。
因此,如何对这类动态解释型语言进行有效的代码保护,成为亟待解决的问题。
发明内容
有鉴于此,本申请实施例提供一种数据加解密方案,以至少部分解决上述问题。
根据本申请实施例的第一方面,提供了一种数据加密方法,包括:获取待加密的动态解释型语言代码及所述代码对应的语法树;对所述语法树进行代码混淆,获得初始加密语法树;对所述初始加密语法树进行针对节点访问的第一加密处理和针对内容访问的第二加密处理,获得再加密语法树;针对所述再加密语法树进行基于语法树的混淆转换处理,获得增强加密语法树;基于所述增强加密语法树,生成所述代码对应的加密代码。
根据本申请实施例的第二方面,提供了一种数据解密方法,包括:获取对动态解释型语言代码进行了加密后的加密代码;对所述加密代码对应的语法树进行转换恢复处理,以获得与加密前的所述动态解释型语言代码对应的语法树的节点位置和/或预设字段的参数相同的加密语法树;基于所述加密语法树进行渲染操作,并在渲染所述加密语法树的每个根节点时进行调用权限校验;在校验通过后,获得可执行的加密语法树代码。
根据本申请实施例的第三方面,提供了一种电子设备,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如第一方面或第二方面所述方法对应的操作。
根据本申请实施例的第四方面,提供了一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面或第二方面所述的方法。
根据本申请实施例的第五方面,提供了一种计算机程序产品,包括计算机指令,该计算机指令指示计算设备执行如第一方面或第二方面所述方法对应的操作。
根据本申请实施例提供的数据加密方案,在针对动态解释型语言代码进行加密时,从语法树对应的代码、对语法树节点的节点访问和内容访问、以及信息转换三个方面依次进行加密,这三个方面互为补充,逐层次步步增强。通过对语法树进行代码混淆,可以扩充语法树对应的代码信息,增大逆向工程难度;通过对进行代码混淆后的语法树进行节点访问的第一加密处理和内容访问的第二加密处理,使得即使在基于语法树的节点进行渲染操作时,也必须经过加密校验的考验,可以保证即使在代码的debug(调试)阶段也无法规避安全校验;通过对进行了第一加密处理和第二加密处理的语法树再次进行基于语法树的混淆转换处理,可以将语法树转换为随机树,从而从入口层就阻断了逆向工程的可能性。由此,极大提升了对动态解释型语言代码的安全保护。
而根据本申请实施例提供的数据解密方案,与数据加密相对应,在解密时需要逐层次进行解密,包括:对加密代码对应的语法树进行转换恢复处理,以获得具有正常节点位置和/或字段参数的加密语法树;进而,在基于该加密语法树进行渲染时,进行调用权限校验;在校验通过的情况下,可获得可执行的加密语法树代码。此时的加密语法树代码对应于前述加密过程,虽然仍为加密,但为进行了代码混淆的语法树,而代码混淆的语法树是可被执行的。至此,加密代码虽未恢复至原始代码状态,但仍可被渲染执行,达到了解密效果。并且,其中的任何一个环节若不能被解密或不能校验通过,都无法执行代码,从而有效避免了非法用户对代码的读取和执行,提高了动态解释型语言代码的安全性。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1为适用本申请实施例的数据加解密方法的示例性系统的示意图;
图2A为根据本申请实施例一的一种数据加密方法的步骤流程图;
图2B为2A所示实施例中的一种数据加密示例场景的示意图;
图3为根据本申请实施例二的一种数据解密方法的步骤流程图;
图4为根据本申请实施例三的一种数据加解密过程的完整过程图;
图5为根据本申请实施例四的一种电子设备的结构示意图。
具体实施方式
为了使本领域的人员更好地理解本申请实施例中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请实施例一部分实施例,而不是全部的实施例。基于本申请实施例中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本申请实施例保护的范围。
下面结合本申请实施例附图进一步说明本申请实施例具体实现。
图1示出了一种适用本申请实施例的数据加解密方法的示例性系统。如图1所示,该系统100可以包括服务器102、通信网络104和/或一个或多个用户设备106,图1中示例为多个用户设备。
服务器102可以是用于存储信息、数据、程序和/或任何其他合适类型的内容的任何适当的服务器。在一些实施例中,服务器102可以执行任何适当的功能。例如,在一些实施例中,服务器102可以用于对动态解释型语言代码进行加密。作为可选的示例,在一些实施例中,服务器102可以被用于基于动态解释型语言代码对应的语法树进行代码加密。作为另一示例,在一些实施例中,服务器102可以被用于进行与代码加密相对应的代码解密。作为可选的示例,在一些实施例中,服务器102可以被用于基于加密代码对应的语法树进行与代码加密相对应的代码解密。需要说明的是,本示例中,服务器102对代码的加密和解密可以部分或全部为服务器自身实现的行为,例如,服务器102需对自身的代码进行加密或解密;也可以为服务器102响应用户设备106请求实现的行为。例如,响应于用户设备106的代码加密请求对其代码进行加密,或者,响应于用户设备106的代码解密请求对其代码进行解密,等等。
在一些实施例中,通信网络104可以是一个或多个有线和/或无线网络的任何适当的组合。例如,通信网络104能够包括以下各项中的任何一种或多种:互联网、内联网、广域网(WAN)、局域网(LAN)、无线网络、数字订户线路(DSL)网络、帧中继网络、异步转移模式(ATM)网络、虚拟专用网(VPN)和/或任何其它合适的通信网络。用户设备106能够通过一个或多个通信链路(例如,通信链路112)连接到通信网络104,该通信网络104能够经由一个或多个通信链路(例如,通信链路114)被链接到服务器102。通信链路可以是适合于在用户设备106和服务器102之间传送数据的任何通信链路,诸如网络链路、拨号链路、无线链路、硬连线链路、任何其它合适的通信链路或此类链路的任何合适的组合。
用户设备106可以包括适合于进行网络访问和代码执行的任何一个或多个用户设备。在一些实施例中,用户设备106可以包括任何合适类型的设备。例如,在一些实施例中,用户设备106可以包括移动设备、平板计算机、膝上型计算机、台式计算机、可穿戴计算机、游戏控制台、媒体播放器、车辆娱乐系统和/或任何其他合适类型的用户设备。可选地,用户设备106可以分为加密请求端用户设备1062和代码执行端用户设备1064。其中,加密请求端用户设备1062可用于向服务器102发送代码加密请求,并将需加密的代码上传至服务器102,以通过服务器102对其代码进行加密。代码执行端用户设备1064获取加密代码进行执行,在一种可能方式中,该加密代码为已经由服务器102进行过解密的代码;在另一种可能方式中,该加密代码需由代码执行端用户设备1064自行解密,若其可正常解密则可正常执行,否则将无法正常执行代码。
尽管将服务器102图示为一个设备,但是在一些实施例中,可以使用任何适当数量的设备来执行由服务器102执行的功能。例如,在一些实施例中,可以使用多个设备来实现由服务器102执行的功能。或者,可使用云服务实现服务器102的功能。
基于上述系统,本申请实施例提供了一种数据加解密方案,以下通过多个实施例进行说明。
实施例一
参照图2A,示出了根据本申请实施例一的一种数据加密方法的步骤流程图。
本实施例从数据加密的角度进行说明,该数据加密方法包括以下步骤:
步骤S202:获取待加密的动态解释型语言代码及所述代码对应的语法树。
语法树是计算机描述一个事物的树状结构,代码对应的语法树是描述该代码的树状结构,其表征了该段代码的语法结构。针对代码的语法树通常分为具体语法树和抽象语法树,虽然具体语法树中包含有更多更具体的信息,但抽象语法树能够更为有效和简洁地表征代码的语法结构,因此,也更为通用。本申请实施例中,若无特殊说明,“语法树”意指抽象语法树。抽象语法树简称AST(Abstract Syntax Tree),其是源代码语法结构的一种抽象表示,以树状的形式表现编程语言的语法结构。
在获得了某段代码后,可以根据该段代码所使用的编程语言的语法规则对其进行解析,从而实现AST的构建。本申请实施例中,针对待加密的动态解释型语言代码生成其对应的语法树的具体过程可由本领域技术人员根据动态解释型语言的语法规则,参考相关技术中的具体方式实现,本申请实施例对此不作限制。
当基于AST进行代码加密时,为了进一步提高加密效果,在一种可行方式中,本步骤可以实现为:获取待加密的动态解释型语言代码,并对所述代码进行代码混淆;对进行了代码混淆后的代码进行解析,生成对应的语法树。
代码混淆是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。例如,将代码中的各种元素,如变量,函数,类的名字等改写成无意义的名字(比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号),使得阅读的人无法根据名字猜测其用途。或者,重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式,比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。或者,打乱代码的格式,比如删除空格,将多行代码变为一行,或者将一行代码断成多行等等。
本方式中,通过对原始的动态解释型语言代码进行代码混淆,可以起到一般程度上的加密作用。又因代码混淆后的代码仍遵循动态解释型语言代码的语法规则,因此,可基于进行了代码混淆后的代码生成语法树。
步骤S204:对语法树进行代码混淆,获得初始加密语法树。
语法树虽以树形结构表征代码的语法结构,但在计算机中其仍使用代码表达,因此,可以对语法树进行代码混淆,以获得初步加密的语法树,即初始加密语法树。
在一种可行方式中,可以获取语法树中的包导入节点,并将包导入节点对应的静态包导入函数替换为动态包导入函数;和/或,获取语法树中所有节点的方法调用函数,将方法调用函数替换为通过属性字符串获取待调用的方法的函数。
其中,包导入是通过导入函数将已经存在的一段完整功能代码导入到当前代码中的过程,由此实现代码复用。一般情况下包导入采用静态导入的方式,即直接导入所需要的代码包。但这种方式,在代码被解析获得后,即使采用了代码混淆的方式,也仍然存在被调用执行的可能。而采用动态导入的方式,代码层面导入的可能是一个标识或一个字符串,该标识或字符串对应于某个索引值或地址,如某个HASH值,再基于该索引值或地址找到相应的存储位置获取代码包,则可有效增强代码的安全性。
此外,对于一段功能代码来说,其中包含有大量的方法调用函数,被解析后即可进行方法调用,因此,为了进一步提升代码安全性,本申请实施例中,还可以将方法调用函数替换为通过属性字符串获取待调用的方法的函数,也即,将原始的调用替换为属性字符串,该替换关系可以被记录,后续合法用户可基于该记录的关系恢复调用,但非法用户将无法使用。
以Python语言代码为例,可以将待加密的代码中的所有import导包统一改为动态导入,所有方法调用改为统一的getattr实现。例如,原始调用为job.do_training()和job.do_valid(),统一混淆之后变为:xxx1.getattr('xxx2')和xxx1.getattr('xxx3')。可见,在代码层面完全无法区分具体函数的语义。但对于合法用户来说,其在后续只需基于预先存储的这种转换的对应的关系,即可通过字串符'xxx2'和'xxx3'找到原始调用关系。
可见,通过这种方式,可以将所有的方法调用,都变为通过索引某个字符串或者HASH值来找到调用关系。由此,增大了逆向工程难度,使其即便是通过了后续层层安全关卡之后,仍然会在AST语法树这一层级因插入了太多参数,示意为N个参数,相当于后续的层层安全关卡需要再走这么多可能性的次数,后面突破的难度假设为M,则该方式将使得难度成为N*M。
步骤S206:对初始加密语法树进行针对节点访问的第一加密处理和针对内容访问的第二加密处理,获得再加密语法树。
通过对节点访问的第一加密处理可以确保访问该语法树甚至访问语法树中节点的操作均为具有访问权限的操作;通过对内容访问的第二加密处理可以确保对节点内容的访问是合法有效的访问。基于此,第一加密处理可以实现为权限校验处理,第二加密处理可以实现为权限校验和/或密码校验处理。
在一种可行方式中,对初始加密语法树进行针对节点访问的第一加密处理可以实现为:针对初始加密语法树的每个根节点,增加在访问该根节点时的调用权限校验处理。对于某段代码来说,其对应的语法树可能为一棵,但也可能为多棵(本申请实施例中,若无特殊说明,与“多”有关的数量,如“多棵”、“多种”等均意指两个及两个以上),每棵语法树具有一个根节点。基于此,可以针对每棵语法树对应的根节点,增加调用权限校验,以保证对当前语法树的访问是合法的。在一种可行的具体实现中,该针对初始加密语法树的每个根节点,增加在访问该根节点时的调用权限校验处理可以具体实现为:获取每个根节点对应的节点解析函数;在每个根节点对应的节点解析函数中插入用于进行调用权限校验的钩子函数。
仍以Python语言代码为示例,可以针对语法树中每棵树的根节点进行内嵌license-check方法,考虑到性能问题,在AST库的内部进行截获,将AST标准库的本身node_parser方法插入hook1函数,函数内容为渲染每个AST根节点的时候进行license校验,从而保证所有的方法都是具备合理有效的调用权限。因在每一个根节点内嵌license-check校验,license需要根据用户的机器等硬件信息进行识别,向server端进行注册请求的发起,获取解密的秘钥;语法树的多个根节点都会有license校验,这样让静态分析跳过license-check基本成为不可能。
在另一种可行方式中,对初始加密语法树进行针对内容访问的第二加密处理包括:确定初始加密语法树中需要进行内容访问的节点,为确定的节点增加在进行内容访问时的调用权限校验处理或加解密处理。例如,在为确定的节点增加在进行内容访问时的调用权限校验处理或加解密处理时,可以获取确定的节点的内容访问函数,在内容访问函数中插入用于调用权限校验的钩子函数,或者,插入用于进行加解密校验的钩子函数。
其中,内容访问大多通过内容访问函数如用于内容访问的调用函数实现,因此,可以通过在其插入用于校验调用权限的钩子函数或加入用于加密或解密的钩子函数实现。仍以Python语言代码为示例,可以为其中的每个getattr()函数进行钩子函数即hook函数的内嵌,具体的hook方法可以是如前所述的license-check,也可以是AES加解密的校验。
通过针对节点访问的第一加密处理和针对内容访问的第二加密处理,可以防止针对pdb(program debug database,程序调试数据库)等调试流程,进入到代码中的每一个函数进行执行,而通过上述方式,每一个函数都需要执行针对内容访问的校验,而且在每个语法树的根节点解析的时候也需要进行针对节点访问的校验,所以能够基本上保护了码在debug(调试)阶段跳过的可能性。
步骤S208:针对再加密语法树进行基于语法树的混淆转换处理,获得增强加密语法树。
虽然再加密语法树已经从很大程度上起到了代码加密的作用,本申请实施例中,还对再加密语法树进行了进一步的基于语法树的混淆转换处理,以进一步增加逆向工程难度。该基于语法树的混淆转换处理主要用于对再加密语法树中的结构和/或信息进行转换,以实现进一步加密目的。
例如,对再加密语法树中的预设字段的参数进行随机化处理,生成并保存随机化处理前后的预设字段的参数之间的映射关系;和/或,对再加密语法树中的每个根节点的左右子树进行随机化置换,生成并保存置换顺序信息。其中,预设字段可以由本领域技术人员根据实际需要设定所需字段,在一种可行方式中,该预设字段可以为树节点的名称字段,预设字段的参数为每个树节点的名称对应的字符串参数。相较于其它字段,树节点的名称字段的参数更易于进行随机化处理,且每个树节点均具有该字段,具有更好的能用性。
仍以Python语言代码为示例,可以将代码对应的语法树中的所有树节点的name字符串参数进行随机化处理,生成转换的映射关系,保存在服务端;和/或,对所有树的根节点的左右子树进行随机化置换,置换顺序保存在服务端。
通过这种方式,可以防止对代码进行静态分析,因为通过AST语法树的一层隔离,只能逆向出当前的语法树的逻辑,实际这个树逆向出来也是不可用的,而对于下一步的操作,由于具有随机化的策略,其解析的结果也只是一堆经过混淆、且含有错误语法的字符串,从而基本上隔离了静态分析跳过license-check的可能性。
步骤S210:基于增强加密语法树,生成所述代码对应的加密代码。
经过前述逐级加密,生成了增强加密语法树,可有效对逆向工程的各个环节进行阻碍,实现对代码的有效保护。
在获得了增加加密语法树后,即可基于该语法树生成对应的加密代码,如该增加加密语法树对应的代码即为原动态解释型语言代码所对应的加密代码,或者,基于该增加加密语法树对应的代码,再增加没有安全要求或安全性要求很低的所需代码,生成最终的加密代码。
在一种可行方式中,还可以判断待加密的动态解释型语言代码是否为可独立运行的功能代码;若是,则对增加加密语法树对应的代码进行加壳保护处理;若否,则直接根据增加加密语法树,生成待加密的动态解释型语言代码对应的加密代码。
例如,如果该动态解释型语言代码是可单独运行的功能代码,则可以进一步进行加壳保护,增强安全性能。其中,加壳是保护原始代码而增加的一层软件实现,软件的壳分为加密壳、压缩壳、伪装壳、多层壳等类,都是为了隐藏代码真正的OEP(入口点,防止被破解)。本示例中,可采用的加壳保护方式包括不限于通过c/c++层级的编译语言等加密手段。而如果该动态解释型语言代码不是独立运行,需要耦合其它的代码,则根据增强加密语法树生成最终的加密代码。
以下,以一个具体场景为示例,对上述过程进行示例性说明,如图2B所示。
图2B中,假设服务端(服务器或云端)存在一段Python语言代码X,用于实现为图像添加AR(增强现实)效果的功能。并且,以该代码X仅对应一棵AST为示例进行简单说明。
若服务端接收到针对代码X进行加密的触发指令(包括但不限于语音指令、手势指令、文本指令、按键或选项指令等),则服务端会先对代码X进行代码混淆(如变量名的字符串数字化等),生成进行了代码混淆后的代码X1;进而,基于代码X1解析生成对应的语法树AST1;接着,再对该AST1进行代码混淆(如所有import导包改为动态导入,所有方法调用改为getattr()实现),生成初始加密语法树AST2;然后,针对该AST2,进行针对节点访问的第一加密处理(如在AST2的根节点的node_parser()方法中插入用于进行license校验的hook1函数),进行针对内容访问的第二加密处理(如在每个内容访问节点的getattr()方法中插入用于进行AES校验的hook2函数),获得再加密语法树AST3;继而,对AST3进行深度代码混淆(如将AST3的所有节点的name字符串参数进行随机化处理,将AST3根节点的左右子树进行随机化置换),获得增强加密语法树AST4;又因代码X可独立实现为图像添加AR效果的功能,因此,再基于AST4进行代码加壳保护,获得AST5;最后,基于AST5获得代码X对应的加密代码。
可见,通过本实施例的数据加密方法,在针对动态解释型语言代码进行加密时,从语法树对应的代码、对语法树节点的节点访问和内容访问、以及信息转换三个方面依次进行加密,这三个方面互为补充,逐层次步步增强。通过对语法树进行代码混淆,可以扩充语法树对应的代码信息,增大逆向工程难度;通过对进行代码混淆后的语法树进行节点访问的第一加密处理和内容访问的第二加密处理,使得即使在基于语法树的节点进行渲染操作时,也必须经过加密校验的考验,可以保证即使在代码的debug(调试)阶段也无法规避安全校验;通过对进行了第一加密处理和第二加密处理的语法树再次进行基于语法树的混淆转换处理,可以将语法树转换为随机树,从而从入口层就阻断了逆向工程的可能性。由此,极大提升了对动态解释型语言代码的安全保护。
实施例二
参照图3,示出了根据本申请实施例二的一种数据解密方法的步骤流程图。
本实施例从与数据加密相对应的数据解密的角度进行说明,本实施例的数据解密方法包括以下步骤:
步骤S302:获取对动态解释型语言代码进行了加密后的加密代码。
例如,该加密代码可以是通过前述实施例一中所述的数据加密方法进行加密后的代码。
步骤S304:对加密代码对应的语法树进行转换恢复处理,以获得与加密前的动态解释型语言代码对应的语法树的节点位置和/或预设字段的参数相同的加密语法树。
该解密步骤对应于前述加密过程中使用基于语法树的混淆转换处理生成的增强加密语法树,因此,需要进行相对应的恢复。在具体恢复进,可根据预存的进行基于语法树的混淆转换处理时的转换关系进行恢复,以使恢复后的语法树的节点位置和/或预设字段的参数与转换前相同。
也即,此种情况下,动态解释型语言代码对应的语法树为对原始的动态解释型语言代码对应的语法树进行代码混淆后,再对进行了代码混淆后的语法树分别进行了针对节点访问的第一加密处理和针对内容访问的第二加密处理后获得的语法树。
基于此,在一种可行方式中,对加密代码对应的语法树进行转换恢复处理可以实现为:按照预存的随机化处理映射关系,对加密代码对应的语法树进行转换恢复处理;其中,随机化处理映射关系包括:用于表征对动态解释型语言代码对应的语法树中的预设字段的参数进行随机化处理前后的预设字段的参数之间的对应关系的第一关系,或者,用于表征对动态解释型语言代码对应的语法树中的每个根节点的左右子树进行随机化置换的置换顺序的第二关系。由此,可以获得具有正常节点位置和/或正常字段的参数的语法树,以为后续进行下一步解密提供较为准确的语法树基础。
步骤S306:基于加密语法树进行渲染操作,并在渲染加密语法树的每个根节点时进行调用权限校验。
因代码为采用动态解释型语言编写的代码,该类代码需要渲染执行,如通过相适配的渲染引擎解析并渲染。在进行渲染操作时,会基于每个节点的信息来执行,在该代码的语法树采用了调用权限校验这一方式进行保护的情况下,当渲染至相应节点时即需进行相应的校验,只有通过了校验,才能对该节点甚至该节点的下级子节点进行访问。
在一种示例中,如前所述,调用权限校验可采用license-check的方式,则可根据用户渲染该代码使用的机器的硬件信息进行识别,向server端进行注册请求的发起,获取解密的秘钥,以通过该秘钥进行校验。若校验通过则可执行后续操作,否则基于当前的加密语法树将无法进行渲染。
步骤S308:在校验通过后,获得可执行的加密语法树代码。
如前所述,若调用权限校验通过,则可访问语法树,获得可执行的加密语法树代码以进行渲染操作。若获得的加密语法树代码即为原始代码,则可直接渲染执行。但若获得的加密语法树中仍存在其它待解密的数据,如前述生成加密代码时进行的加密处理未被完全解密,则会存在执行过程中仍需解密的可能性。
例如,若获得的加密语法树中还存在针对内容访问的第二加密处理后的数据,则在执行加密语法树代码的过程中,若确定待执行的为内容访问函数,则对内容访问函数进行调用权限校验或加解密校验;在校验通过后,通过内容访问函数进行内容访问。
此外,还可能存在的情况是,不管是针对根节点的调用权限校验通过还是针对内容访问函数的调用权限校验或加解密校验通过,获得的仍可能是进行了代码混淆后的语法树,如实施例一中的初始加密语法树,但因普通的混淆状态是可以记录调用关系的,因此,该种状态下的语法树对应的代码是可以执行的。
通过上述过程,实现了对采用多层级加密后的加密代码的解密和执行。
可见,通过本实施例的数据加密方法,与数据加密相对应,在解密时需要逐层次进行解密,包括:对加密代码对应的语法树进行转换恢复处理,以获得具有正常节点位置和/或字段参数的加密语法树;进而,在基于该加密语法树进行渲染时,进行调用权限校验;在校验通过的情况下,可获得可执行的加密语法树代码。此时的加密语法树代码对应于前述加密过程,虽然仍为加密,但为进行了代码混淆的语法树,而代码混淆的语法树是可被执行的。至此,加密代码虽未恢复至原始代码状态,但仍可被渲染执行,达到了解密效果。并且,其中的任何一个环节若不能被解密或不能校验通过,都无法执行代码,从而有效避免了非法用户对代码的读取和执行,提高了动态解释型语言代码的安全性。
实施例三
参照图4,示出了根据本申请实施例三的一种数据加解密过程的完整过程图。
本实施例中,以采用动态解释型语言Python语言编写的代码为示例,该数据加解密过程包括:
(一)代码加密过程
包括:
步骤S402:获取原始的待加密的代码。
该代码采用动态解释型语言编写。
步骤S404:对原始的待加密的代码进行初步代码混淆。
本步骤中,首先对原始的代码进行普通的代码混淆,以增大可读性的难度,这样,针对逆向工程的情景下,若其他所有环节都被攻克后,仍可增大理解难度。
此外,本步骤中的代码混淆可以采用常规的代码混淆手段实现,包括但不限于:所有变量名、方法名的字符串数字化等混淆方式。
步骤S406:生成初步代码混淆后的代码对应的AST语法树。
本步骤中,对进行了代码混淆后的代码进一步解析,生成AST语法树的标准初步格式。
步骤S408:对AST语法树进行初步AST语法树代码混淆。
本步骤中,根据生成的AST语法树,将语法树进行增强代码混淆,包括:(1)所有import导包统一改为动态导入;(2)所有方法调用改为统一的getattr()实现。
通过本步骤,增大了逆向工程难度,保证即便是通过了后续层层关卡之后,仍然在AST语法树这一层级插入了太多参数(设定为N个),相当于后续的层层关卡需要再走这么多可能性的次数,后面突破的难度为M,则总难度成为N*M。
步骤S410:对进行了代码混淆的AST语法树进行加密方法内嵌。
包括:
(1)针对AST语法树本身的node(节点)解析时,针对每个树的根节点进行内嵌license-check方法,考虑到性能问题,所以在AST库的内部进行截获,将AST标准库的本身node_parser方法插入hook1函数,函数内容为渲染每个AST语法树根节点的时候进行license校验,从而保证所有的方法都是具备合理有效的调用权限。
具体地,在每一个根节点进行内嵌license-check检查机制,license需要根据用户的机器等硬件信息进行识别,向server端进行注册请求的发起,获取解密的秘钥;代码的多个根节点都会有license的检查点,这样让静态分析跳过license-check基本成为不可能。
(2)针对AST语法树的内容也就是最原始代码执行的方法进行解析时,针对AST语法树的内容进行hack,也就是为每个getattr()方法进行hook2方法的内嵌,具体的hook方法可以是license-check,也可以是AES加解密的校验。
通过本步骤,可以防止用户针对pdb等调试流程,进入到每一个函数进行执行,因为每一个function都需要执行hook1的校验,而且在每个node解析的时候也需要hook2的校验,所以基本上保护了代码在debug阶段跳过的可能性。
步骤S412:进行深度代码混淆。
本步骤中,代码在语法树层级进一步转换,转换之后的语法树是无效的,无法直接进行渲染后执行。
具体操作可以包括:(1)所有语法树的节点的name字符串参数进行随机化处理,生成转换的映射关系,保存在服务端;(2)所有语法树的根节点的左右子树进行随机化置换,置换顺序保存在服务端。
通过本步骤,可以防止用户进行静态分析,因为通过AST语法树的一层隔离,用户只能逆向出当前的语法树的逻辑,实际这个树逆向出来也是不可用的,而对于下一步的操作,由于具有随机化的策略,所以还是需要进一步验证license或AES才能获取最终的语法有效的AST,否则解析的结果也是无法真正执行,只是一堆经过混淆、且含有错误语法的字符串。由此,隔离了静态分析跳过license的可能性。
步骤S414:判断被加密的代码是否为可独立运行的功能代码。如果是,进行加壳保护;如果不是,生成最终的加密代码。
如果是可单独运行的功能代码,可以进一步进行加壳保护,增强安全性能,加壳保护方式包括不限于:通过c/c++层级的编译语言等加密手段;如果不是可以独立运行的功能代码,需要耦合其它的代码,则基于进行了深度代码混淆后的AST语法树生成最终的加密代码。
(二)代码解密过程
包括:
步骤S416:获取加壳代码。
获取加壳后的代码,可以直接执行,但因其仍为多层级加密后的代码,因此需校验license-check后,转为最终的加密代码,然后继续执行后续解密操作。
步骤S418:获取加密代码。
可选地,在获取加密代码后,可以根据用户的信息动态获取解密秘钥,秘钥只有一次使用机会,每次调用时会重新生成,所以即便是截获了秘钥,也无法二次重放,限制代码的使用权限。
步骤S420:进行代码恢复。
每一次的代码恢复都会根据步骤S418生成的秘钥进行语法树的动态渲染,包括按照映射关系(即步骤S412中存储服务端的映射关系及置换顺序)进行代码的深度恢复,恢复之后成为语法有效的、可以运行的语法树代码。由此,可以加大语法树被逆向静态分析的可能性,因为即便是逆向恢复到此时运行的AST语法树的代码结构,但是无法二次执行会导致下一次重新运行时校验秘钥失败。
步骤S422:语法树渲染。
将根据步骤S420恢复的可执行的语法树结构,渲染成为字符串,字符串即为最终可以运行的代码.
步骤S424:校验内嵌的license-check。
语法树渲染时,会触发语法树的hook1方法,从而在渲染每一个语法树的根节点的时候执行license-check,保证了具有合法调用权限的用户才能有效地执行语法树对应的代码。
步骤S426:判断是否渲染完所有语法树的根节点,如果没有渲染完所有语法树的根节点,则继续回到步骤S420继续执行代码恢复操作。如果渲染完所有语法树根节点,则进入以下的代码执行过程。
(三)代码执行过程
包括:
步骤S428:获得深度混淆的语法树的代码。
真正完整地执行完语法树渲染以及隐含的hook1方法之后,生成的最终代码就是多次混淆加密的代码。
步骤S430:执行语法树中的方法。
在每个方法真正执行的时候,代码侧看到的明文是AST语法树层级混淆后的getattr()方法,以及一堆混淆后的变量名,而每个getattr()方法是无法获知其语义的。
步骤S432:校验内嵌的license或AES。
本质上,语法树节点中的方法的执行都会归一到getattr()方法,又因已经对每个getattr()方法插入了hook2函数,也就是对每一层级getattr()的调用都会触发hook2,即对AES的校验或对license的校验,从而保证了每一次方法调用的有效性。
步骤S434:判断语法树中的方法是否执行结束,如果没有执行结束,则继续回到步骤S432执行;如果执行结束,则结束流程退出。
由上可见,通过对待加密代码的原始代码层级、AST语法树层级以及深度代码渲染层级进行不同的混淆保护,极大增加了代码静态分析的难度。通过将license的校验过程以及AES的校验过程分别插入到每一个AST语法树的内部解析方法以及每一个实际调用函数的getattr()方法,从而保证license的必然执行,极大增加了代码被逆向跳过license的可能性。并且,AST语法树本身是确定性存在的,引入随机化的深度代码渲染,将随机性转化为不可执行的语法树,基本隔离了静态分析的可能性,从而保证最终语法树的调用均能够经过AES/license等验证。此外,对于用户实际调用而言,不需要固定的语言环境的版本,只需要直接调用提供的方法。
通过上述过程,使用(a)对AST语法树进行代码混淆、(b)针对AST语法树进行license和/或AES内嵌、(c)对AST语法树进行深度代码混淆,获得增强AST语法树这些加密处理互补进行,加密过程从(a)-(b)-(c),逆向过程则需要从(c)-(b)-(a),当进行逆向工程时,首先(c)为增强AST语法树,本质上为不可运行的字符串,而非代码,并通过字符串的随机性,让本来固定的AST语法树变为随机树的实现,逆向出来的只是不可用的随机树,从而从入口层就阻断了逆向代码的可能性;(b)为在最终代码的方法调用层以及AST语法树每一个节点渲染层插入license/AES安全校验,从而保证在debug阶段也无法规避安全校验的问题;最终的(a)代码混淆的AST语法树,将原本只有x个的方法扩充到N个,这样最终逆向(b)和(c)的难度值为M的话,整体逆向的难度就变为了N*M。通过这些加密处理,基本上可以断绝恶意访问和逆向工程的可能性。
实施例四
参照图5,示出了根据本申请实施例四的一种电子设备的结构示意图,本申请具体实施例并不对电子设备的具体实现做限定。
如图5所示,该电子设备可以包括:处理器(processor)502、通信接口(Communications Interface)504、存储器(memory)506、以及通信总线508。
其中:
处理器502、通信接口504、以及存储器506通过通信总线508完成相互间的通信。
通信接口504,用于与其它电子设备或服务器进行通信。
处理器502,用于执行程序510,具体可以执行上述数据加密方法实施例或数据解密方法实施例中的相关步骤。
具体地,程序510可以包括程序代码,该程序代码包括计算机操作指令。
处理器502可能是CPU,或者是特定集成电路ASIC(Application SpecificIntegrated Circuit),或者是被配置成实施本申请实施例的一个或多个集成电路。智能设备包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个CPU;也可以是不同类型的处理器,如一个或多个CPU以及一个或多个ASIC。
存储器506,用于存放程序510。存储器506可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。
程序510具体可以用于使得处理器502执行上述数据加密方法或数据解密方法对应的操作。
程序510中各步骤的具体实现可以参见上述数据加密方法实施例或数据解密方法实施例中的相应步骤和单元中对应的描述,并具有相对应的有益效果,在此不赘述。所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的设备和模块的具体工作过程,可以参考前述方法实施例中的对应过程描述,在此不再赘述。
本申请实施例还提供了一种计算机程序产品,包括计算机指令,该计算机指令指示计算设备执行上述多个方法实施例中的任一数据加密方法或数据解密方法对应的操作。
需要指出,根据实施的需要,可将本申请实施例中描述的各个部件/步骤拆分为更多部件/步骤,也可将两个或多个部件/步骤或者部件/步骤的部分操作组合成新的部件/步骤,以实现本申请实施例的目的。
上述根据本申请实施例的方法可在硬件、固件中实现,或者被实现为可存储在记录介质(诸如CD ROM、RAM、软盘、硬盘或磁光盘)中的软件或计算机代码,或者被实现通过网络下载的原始存储在远程记录介质或非暂时机器可读介质中并将被存储在本地记录介质中的计算机代码,从而在此描述的方法可被存储在使用通用计算机、专用处理器或者可编程或专用硬件(诸如ASIC或FPGA)的记录介质上的这样的软件处理。可以理解,计算机、处理器、微处理器控制器或可编程硬件包括可存储或接收软件或计算机代码的存储组件(例如,RAM、ROM、闪存等),当所述软件或计算机代码被计算机、处理器或硬件访问且执行时,实现在此描述的方法。此外,当通用计算机访问用于实现在此示出的方法的代码时,代码的执行将通用计算机转换为用于执行在此示出的方法的专用计算机。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请实施例的范围。
以上实施方式仅用于说明本申请实施例,而并非对本申请实施例的限制,有关技术领域的普通技术人员,在不脱离本申请实施例的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本申请实施例的范畴,本申请实施例的专利保护范围应由权利要求限定。

Claims (14)

1.一种数据加密方法,包括:
获取待加密的动态解释型语言代码及所述代码对应的语法树;
对所述语法树进行代码混淆,获得初始加密语法树;
对所述初始加密语法树进行针对节点访问的第一加密处理和针对内容访问的第二加密处理,获得再加密语法树;
针对所述再加密语法树进行基于语法树的混淆转换处理,获得增强加密语法树;
基于所述增强加密语法树,生成所述代码对应的加密代码。
2.根据权利要求1所述的方法,其中,对所述初始加密语法树进行针对节点访问的第一加密处理,包括:
针对所述初始加密语法树的每个根节点,增加在访问该根节点时的调用权限校验处理。
3.根据权利要求2所述的方法,其中,所述针对所述初始加密语法树的每个根节点,增加在访问该根节点时的调用权限校验处理,包括:
获取每个根节点对应的节点解析函数;
在每个根节点对应的节点解析函数中插入用于进行调用权限校验的钩子函数。
4.根据权利要求1所述的方法,其中,对所述初始加密语法树进行针对内容访问的第二加密处理,包括:
确定所述初始加密语法树中需要进行内容访问的节点,为确定的所述节点增加在进行内容访问时的调用权限校验处理或加解密处理。
5.根据权利要求4所述的方法,其中,所述为确定的所述节点增加在进行内容访问时的调用权限校验处理或加解密处理,包括:
获取确定的所述节点的内容访问函数,在所述内容访问函数中插入用于调用权限校验的钩子函数,或者,插入用于进行加解密校验的钩子函数。
6.根据权利要求1所述的方法,其中,所述对所述语法树进行代码混淆,获得初始加密语法树,包括:
获取所述语法树中的包导入节点,并将包导入节点对应的静态包导入函数替换为动态包导入函数;
和/或,
获取所述语法树中所有节点的方法调用函数,将所述方法调用函数替换为通过属性字符串获取待调用的方法的函数。
7.根据权利要求1所述的方法,其中,所述针对所述再加密语法树进行基于语法树的混淆转换处理,获得增强加密语法树,包括:
对所述再加密语法树中的预设字段的参数进行随机化处理,生成并保存随机化处理前后的预设字段的参数之间的映射关系;
和/或,
对所述再加密语法树中的每个根节点的左右子树进行随机化置换,生成并保存置换顺序信息。
8.根据权利要求1所述的方法,其中,所述获取待加密的动态解释型语言代码及所述代码对应的语法树,包括:
获取待加密的动态解释型语言代码,并对所述代码进行代码混淆;
对进行了代码混淆后的所述代码进行解析,生成对应的语法树。
9.根据权利要求1所述的方法,其中,所述基于所述增强加密语法树,生成所述代码对应的加密代码,包括:
判断所述待加密的动态解释型语言代码是否为可独立运行的功能代码;
若是,则对所述增强加密语法树对应的代码进行加壳保护处理;
若否,则直接根据所述增强加密语法树,生成所述待加密的动态解释型语言代码对应的加密代码。
10.一种数据解密方法,包括:
获取对动态解释型语言代码进行了加密后的加密代码;
对所述加密代码对应的语法树进行转换恢复处理,以获得与加密前的所述动态解释型语言代码对应的语法树的节点位置和/或预设字段的参数相同的加密语法树;
基于所述加密语法树进行渲染操作,并在渲染所述加密语法树的每个根节点时进行调用权限校验;
在校验通过后,获得可执行的加密语法树代码。
11.根据权利要求10所述的方法,其中,所述方法还包括:
在执行所述加密语法树代码的过程中,若确定待执行的为内容访问函数,则对所述内容访问函数进行调用权限校验或加解密校验;
在校验通过后,通过所述内容访问函数进行内容访问。
12.根据权利要求10或11所述的方法,其中,所述对所述加密代码对应的语法树进行转换恢复处理,包括:
按照预存的随机化处理映射关系,对所述加密代码对应的语法树进行转换恢复处理;
其中,所述随机化处理映射关系包括:用于表征对所述动态解释型语言代码对应的语法树中的预设字段的参数进行随机化处理前后的预设字段的参数之间的对应关系的第一关系,或者,用于表征对所述动态解释型语言代码对应的语法树中的每个根节点的左右子树进行随机化置换的置换顺序的第二关系。
13.根据权利要求12所述的方法,其中,所述动态解释型语言代码对应的语法树为对原始的动态解释型语言代码对应的语法树进行代码混淆后,再对进行了代码混淆后的语法树分别进行了针对节点访问的第一加密处理和针对内容访问的第二加密处理后获得的语法树。
14.一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现如权利要求1-13中任一所述的方法。
CN202210039481.1A 2022-01-13 2022-01-13 数据加、解密方法及计算机存储介质 Pending CN114357391A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210039481.1A CN114357391A (zh) 2022-01-13 2022-01-13 数据加、解密方法及计算机存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210039481.1A CN114357391A (zh) 2022-01-13 2022-01-13 数据加、解密方法及计算机存储介质

Publications (1)

Publication Number Publication Date
CN114357391A true CN114357391A (zh) 2022-04-15

Family

ID=81108378

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210039481.1A Pending CN114357391A (zh) 2022-01-13 2022-01-13 数据加、解密方法及计算机存储介质

Country Status (1)

Country Link
CN (1) CN114357391A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117349803A (zh) * 2023-12-06 2024-01-05 浙江大学 代码解混淆方法、装置、电子设备及计算机可读存储介质

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117349803A (zh) * 2023-12-06 2024-01-05 浙江大学 代码解混淆方法、装置、电子设备及计算机可读存储介质
CN117349803B (zh) * 2023-12-06 2024-03-19 浙江大学 代码解混淆方法、装置、电子设备及计算机可读存储介质

Similar Documents

Publication Publication Date Title
JP6257754B2 (ja) データの保護
US7254586B2 (en) Secure and opaque type library providing secure data protection of variables
US7395433B2 (en) Method and system for sustainable digital watermarking
US10354064B2 (en) Computer implemented method and a system for controlling dynamically the execution of a code
JP5996810B2 (ja) 自己書換え基盤のアプリケーションコード難読化装置及びその方法
KR101216995B1 (ko) 인덱스 테이블 기반 코드 암호화 및 복호화 장치 및 그 방법
CN104318135B (zh) 一种基于可信执行环境的Java代码安全动态载入方法
US20170116410A1 (en) Software protection
CN104680039B (zh) 一种应用程序安装包的数据保护方法及装置
US20060075260A1 (en) Information security method and system
CN102236757A (zh) 一种适用于Android系统的软件保护方法及系统
CN106650341A (zh) 基于smali流程混淆技术的Android应用加固方法
CN102576391A (zh) 嵌入在shell代码中的软件许可
CN113010856A (zh) 一种动态非对称加解密的JavaScript代码混淆方法与系统
US20110271350A1 (en) method for protecting software
CN106209346B (zh) 白盒密码技术交错查找表
CN110245464B (zh) 保护文件的方法和装置
CN114357391A (zh) 数据加、解密方法及计算机存储介质
CN113434148B (zh) 防解密客户端开发编译方法、装置、电子设备及存储介质
CN111475168A (zh) 一种代码编译方法及装置
CN117093964A (zh) 一种源代码的加密方法、装置、存储介质及电子设备
Khwaja et al. A security feature framework for programming languages to minimize application layer vulnerabilities
CN107403103B (zh) 文件解密方法和装置
CN111291333A (zh) 一种Java应用程序加密方法及装置
Kumbhar et al. Hybrid Encryption for Securing SharedPreferences of Android Applications

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