【具体实施方式】
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明一实施例提供的脚本加密方法的流程示意图。如图1所示,该方法包括:
101、获取待加密的原始脚本,该原始脚本包括需要且可以被加密的第一数据。
102、根据上述第一数据所属的数据类型和预先配置的基准数据与符号串的映射关系,获取上述第一数据对应的符号串,基准数据是指由原始脚本使用的原始脚本语言的弱类型特性所确定的第一数据类型下可以直接映射到符号串的数据。
103、将上述第一数据替换为第一数据对应的符号串,获得加密脚本。
首先说明,本实施例中待加密的原始脚本包括至少一个数据,这些数据可以是常量、变量、对象、运算符号以及关键字等。在这些数据中,有些数据是可以被加密的,有些数据是不需要或者不可以被加密的,例如对于运算符号和关键字可以不用加密。根据原始脚本所使用的脚本语言的不同,这些可以被加密或者不可以被加密的数据会有所不同。为便于描述和区分,本实施例将原始脚本中需要加密且可以被加密的数据称为第一数据,第一数据也是原始脚本中的数据,且第一数据可以是一个或多个。其中,在对原始脚本的加密过程中,对每个第一数据的处理过程都相同。
本实施例中的符号串包括至少一个符号,所述符号可以是单位符号、数学符号、特殊符号以及标点符号等,例如可以是+、()、{}、[]、~、‘’等等。
其中,第一数据类型是指具有数据可以直接映射到符号串的数据类型,也就是说,该第一数据类型下一定有数据可以直接映射到符号串。为便于描述,本实施例将第一数据类型下可以直接映射到符号串的数据称为基准数据。值得说明的是,对于第一数据类型来说,可以是该数据类型下的所有数据都可以直接映射到符号串,也可以是该数据类型下的部分数据可以直接映射到符号串,这具体可由原始脚本所使用的脚本语言的弱类型特性决定。
本实施例中的第一数据类型以及第一数据类型下可以直接映射到符号串的基准数据以及基准数据所映射到的符号串,可以通过对原始脚本采用的脚本语言的弱类型特性进行分析获得。根据脚本语言的不同,所分析出的第一数据类型、基准数据以及基准数据所映射到的符号串会有所不同。
值得说明的是,本实施例方法优选适用于具有弱类型特性的脚本语言,例如javascript。
以具有弱类型特性的脚本语言为例,预先配置基准数据与符号串的映射关系的过程包括:
根据待加密的原始脚本使用的脚本语言的弱类型特性,分析该脚本语言涉及的数据类型,确定第一数据类型,并确定第一数据类型下的基准数据以及基准数据对应的至少一个符号串;之后将第一数据类型下的基准数据和基准数据对应的至少一个符号串对应存储到符号映射表中。
举例说明,以javascript为例,该语言涉及的数据类型包括:常量、全局变量类型和对象类型等。其中,常量类型又可以包括数字类型、布尔类型、NaN类型、未定义(undefined)类型、字符串类型等。通过对javascript的若类型特性进行分析,假设可以获得常量类型可以作为第一数据类型,即数字类型、布尔类型、NaN类型、未定义类型、字符串类型等可以作为第一数据类型。即,这些数据类型下存在部分或全部数据可以直接对应到符号串。下面举例说明:
对于布尔类型:布尔类型包括真(true)和假(false)两个值,这两个值与符号串的对应关系如下:
!″=true
![]=false
!{}=false
对于数字类型:部分数值与符号串的对应关系如下:
+[]=0
+″=0
-[]=0
-″=0
~[]=-1
~″=-1
~{}=-1
~~[]=0
-~[]=1
~-~[]=-2
-~-~[]=2
~[]<<-~[]=-2
-~[]<<-~[]=2
对于NaN类型:其只有一个值NaN,该值与符号串的对应关系如下:
+{}=NaN
-{}=NaN
对于字符串类型:部分字符串与符号串的对应关系如下:
+{}+”=‘NaN’
!″+[]='true'
![]+[]='false'
″+{}='[object Object]'
[][0]+″='undefined'
[].sort+″='function sort(){\n[native code]\n}
上述[0]表示数字0对应的符号串,这部分内容可以替换为数字0对应的符号串;上述.sort表示这部分内容无法映射到符号串。
对于字符串类型:部分字符串与符号串的对应关系如下:
(![]+[])[1]=a
上述对应关系以及相关信息会被存储在符号映射表中。
在本实施例中,脚本加密引擎首先获取待加密的原始脚本,然后获取原始脚本中的第一数据。例如,脚本加密引擎可以通过运行该原始脚本,以便逐个读取该原始脚本中的第一数据。
在读取到第一数据后,脚本加密引擎确定第一数据所属的数据类型,对于脚本加密引擎来说在读取第一数据的过程是可以识别出第一数据所属的数据类型。例如,脚本加密引擎可以根据定义第一数据使用的关键字,来确定第一数据所属的数据类型;或者对于字符串类型,脚本加密引擎会读取到单引号,于是可以根据该单引号确定该第一数据是字符串类型。
脚本加密引擎根据第一数据所属的数据类型和预先配置的基准数据和符号串的映射关系,获取第一数据对应的符号串;之后,利用将第一数据替换为第一数据对应的符号串。当将所有第一数据均替换为符号串后,就得到加密脚本。
举例说明,假设原始脚本包括的url常量为:url=‘https://alipay.com’,则经过上述过程进行加密后得到如下内容:
this[(″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~[]-~[])+(-~-~″<<-~″))]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~″-~[])+-~[])]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~″)+-~-~[]-~[])])]=(″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~″<<-~[])+-~-~[]-~″)]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~″<<-~-~″-~[])+-~-~″-~″)]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~″-~[])+-~-~[]-~[])]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~″)+(-~-~[]<<-~[])+-~-~[]-~″)]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~″-~[])+-~-~″)]+″[(((+[]))+″+(((-~-~[]<<-~″)))+″)](((-~-~″<<(-~-~″<<-~″))+(-~-~[]<<-~-~[]-~″)+(-~-~[]<<-~-~[])+-~-~[]))+″[(((+[]))+″+(((-~-~[]<<-~″)))+″)](((-~-~″<<(-~-~″<<-~[]))+(-~-~[]<<-~-~[])+(-~-~[]<<-~[])+-~-~[]-~″))+″[(((+[]))+″+(((-~-~[]<<-~″)))+″)](((-~-~″<<(-~-~″<<-~″))+(-~-~[]<<-~-~″)+(-~-~″<<-~[])+-~-~″-~″))+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][(-″)]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~″)+-~-~[]-~″)]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~″))]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~[])+(-~-~[]<<-~[])+-~-~″-~″)]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][(-″)]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~″<<-~-~[]-~″)+(-~-~″<<-~-~[]))]+″[(((+[]))+″+(((-~-~[]<<-~″)))+″)](((-~-~″<<(-~-~″<<-~″))+(-~-~″<<-~-~[])+(-~-~[]<<-~″)+-~-~″))+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][(-~-~″)]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~[]<<-~-~[])+(-~-~″<<-~″)+-~-~[])]+″[(((+[]))+″+(((-~-~″<<-~[])+-~″))+″)][((-~-~″<<-~-~[])+(-~-~″<<-~[]))])
由上述可见,本实施例预先配置基准数据与符号串的映射关系,根据加密脚本中数据所属的数据类型和基准数据与符号串的映射关系,获取该数据对应的符号串,用符号串替换数据,达到对脚本加密的目的。其中,符号串本身比较晦涩,利用符号串代表一定含义,一般无法直接从符号串中识别出该含义,而本实施例利用符号串进行加密后的脚本直观看起来更像是一堆乱码,完全掩盖了脚本原本的意图和过程,极难被阅读理解并破解,因此提高了脚本的安全性。
在一可选实施方式中,如图2所示,上述步骤102的一种实施方式包括:
1021、脚本加密引擎创建原始脚本的抽象语法树,其中,第一数据指向该抽象语法树上的一个节点。
其中,脚本加密引擎可以借助开源工具esprima来创建抽象语法树,具体过程可参见现有技术,在此不再赘述。
值得说明的是,本实施例中抽象语法树上的部分节点对应第一数据,即原始脚本中的每个第一数据指向抽象语法树上的一个节点,第一数据可以作为其所指向的节点的一个属性信息。在创建语法树时,会对第一数据指向的节点进行类型标记,该节点的类型也就是指向该节点的第一数据的类型,例如字符串类型、数字类型等。
1022、根据第一数据所属的数据类型与第一数据类型的匹配特性和上述抽象语法树上第一数据指向的节点,获得抽象语法树上第一数据对应的可加密节点。
在获得抽象语法树之后,脚本加密引擎可以深度遍历抽象语法树,获得抽象语法树上第一数据所指向的节点,之后根据第一数据所属的数据类型与第一数据类型的匹配特性,对抽象语法树上第一数据指向的节点进行处理,获得抽象语法树上由第一数据对应的可加密节点。其中,对于与第一数据类型相匹配的第一数据指向的节点一般为叶子节点,因此通过深度遍历抽象语法树可以很容易找到与第一数据类型相匹配的第一数据指向的节点;对于与第一数据类型不匹配的第一数据所指向的节点,在深度遍历抽象语法树的过程中可以先查找非叶子节点的主表达式节点(一个非叶子节点是不是主表达式节点会在构建该非叶子节点时作为该非叶子节点的名称进行标记),找到主表达式节点后获取该主表达式节点后面的叶子节点作为与第一数据类型不匹配的第一数据所指向的节点。
其中,第一数据所属的数据类型与第一数据类型的匹配特性包括相匹配和不匹配两种。基于此,步骤1022具体为:
如果第一数据所属的数据类型与第一数据类型相匹配,则脚本加密引擎在找到第一数据指向的节点后可以直接确定第一数据指向的节点即为第一数据对应的可加密节点;如果第一数据所属的数据类型与第一数据类型不匹配,则在找到第一数据指向的节点后对第一数据进行表达方式的等价替换,获得含义与第一数据相同但数据类型与第一数据类型相匹配的第二数据,将第二数据指向的节点扩展为一棵子树,将该子树的节点作为第一数据对应的可加密节点。
值得说明的是,第二数据指向的节点也就是第一数据指向的节点。第一数据和第二数据仅在于数据类型不同,其他特性均相同。
另外,本实施例所说的数据类型相匹配主要是指数据类型相同,相应的,数据类型不匹配主要是指数据类型不相同,但并不限于此。
举例说明,第一数据类型可以是包括字符串类型的常量类型,该常量类型除了包括字符串类型之外,还可以包括数字类型、布尔类型等。如果第一数据所属的数据类型与第一数据类型相匹配,则第一数据所属的数据类型可以是常量类型,例如可以是字符串类型、数字类型、布尔类型或未定义类型等。如果第一数据所属的数据类型与第一数据类型不匹配,则第一数据所属的数据类型可以是全局变量类型或对象类型等。
基于此,脚本加密引擎对第一数据进行表达方式的等价替换,获得第二数据,主要是指对第一数据进行表达方式的等价替换,获得含义与第一数据相同但数据类型为字符串类型的第二数据。
相应的,将第二数据对应的节点扩展为一棵子树,包括:将第二数据对应的节点作为父节点,将第二数据中的每个字符扩展为该父节点对应的一个子节点,获得上述子树。
以第二数据所属的数据类型为字符串类型为例,对表达方式的等价替换以及扩展子树进行举例说明:
对于对象类型的第一数据obj.method将其替换为字符串(即第二数据),即obj.method->obj[‘method’],则可以将obj[‘method’]对应的节点作为父节点,将该字符串中的字符m、e、t、h、o、d分别作为该父节点的一个子节点,扩展出一棵子树。
对于全局变量类型的第一数据a可以将其替换为字符串(即第二数据),即var a->this[‘a’];则可以将this[‘a’]对应的节点作为父节点,将该字符串中的字符a作为该父节点的一个子节点,扩展出一棵子树。
1023、根据第一数据对应的可加密节点查询预先配置的基准数据与符号串的映射关系,获得第一数据对应的符号串。
在获得第一数据对应的可加密节点后,脚本加密引擎可以根据第一数据对应的加密节点查询预先配置的基准数据与符号串的映射关系,获得第一数据对应的符号串。
具体的,脚本加密引擎可以确定指向第一数据对应的可加密节点的第三数据;然后确定第三数据用基准数据进行表达时的表达式语句;根据该表达式语句查询上述基准数据与符号串的映射关系,获得第一数据对应的符号串。
基于上述,对于确定指向第一数据对应的可加密节点的第三数据的过程包括:
如果第一数据所属的数据类型与第一数据类型相匹配,由于第一数据指向的节点即为第一数据对应的可加密节点,因此则脚本加密引擎可以直接将第一数据作为指向该可加密节点的第三数据;如果第一数据所属的数据类型与第一数据类型不匹配,则脚本加密引擎可以将扩展后指向该可以加密节点的数据作为第三数据。基于上述将第一数据等价变换为字符串的实施方式,脚本加密引擎可以将字符串类型的第二数据中的字符分别作为指向对应的可加密节点的数据。
进一步,上述确定第三数据用基准数据进行表示时的表达式语句的过程包括:
如果第三数据本身为基准数据,则可以直接将第三数据本身作为第三数据用基准数据进行表示时的表达式语句;例如,对于数字类型的第三数据1,由于数字类型的1属于可以直接映射到符号串的基准数据,因此可以直接将1作为上述用基准数据表示的表达式语句;又例如,对于布尔类型的第三数据true,由于布尔类型的数据属于可以直接映射到符号串的基准数据,因此可以直接将true作为上述用基准数据表示的表达式语句;对于字符串类型的第三数据’a’,由于字符串’a’属于可以直接映射到符号串的基准数据,因此可以直接将字符串’a’作为上述用基准数据表示的表达式语句,等等。
如果第三数据本身不是基准数据,则可以将第三数据转换为用基准数据表示,获得用基准数据表示该第三数据的表达式语句。
进一步,如果第三数据能够直接用基准数据进行表示,则直接用基准数据表示第三数据,获得用基准数据表示该第三数据的表达式语句;如果第三数据不能够直接用基准数据进行表示,则可以先对第三数据进行编码转换,获得可以直接用基准数据表示且含义相同的第四数据,然后再直接用基准数据表示第四数据,获得用基准数据表示该第三数据的表达式语句。
举例说明,假设第三数据是数字类型的5,且数字类型的基准数据仅包括0、1、2、-1和-2,则第三数据5不属于基准数据,但可以直接由基准数据来表示,例如5可以表示为2+2+1,于是可以用表达式2+2+1来查询基准数据与符号串的映射关系,依次将2、2、1对应的符号串进行相加,获得第三数据5对应的符号串;又例如5还可以表示为1+1+1+2,于是可以用表达式1+1+1+2来查询基准数据与符号串的映射关系,依次将1、1、1、2对应的符号串进行相加,获得第三数据5对应的符号串。值得说明的是,基准数据可能对应多个符号串,则可以从多个符号串中任选一个使用。
假设第三数据是字符串类型的’g’,且字符串类型的基准数据仅包括’a’,由此可见第三数据’g’不属于基准数据,且也不能直接由基准数据来表示,于是可以对第三数据’g’进行编码转换,获得’g’对应的数字103,再由数字类型的基准数据表达该数字103,例如,103可以用26+25+22+2+1来表示。
例如,如果第三数据为包括一个字符的字符串,则可以采用函数String.fromCharCode(code:int)对字符进行编码转换,其中,code代表字符,int代表整数的数字。例如,对字符g进行编码转换获得的数字是103。
进一步,为了增强安全性,可以预先将fromCharCode方法的引用随机映射到某个符号串上,这样使用时就无需显示调用fromCharCode方法,如:
‘’.fromCharCode(((-~-~″<<(-~-~[]<<-~″)+-~[])+(-~-~[]<<(-~-~[]<<-~″))+(-~-~″<<-~″)+-~-~″-~″))
可以变更为:
″[(((-″))+″+(((-~-~[]<<-~[])+-~[]))+″)]((-~-~[]<<(-~-~[]<<-~[])+-~[])+(-~-~''<<(-~-~″<<-~[]))+(-~-~″<<-~″)+-~-~″-~[])
值得说明的是,第三数据用基准数据表达时可能存在多个不同的表达式语句,可以随机选择其中一个,或者可以按照简单原则,选择最简单的一个。
在获得第三数据用基准数据表达时的表达式语句后,脚本加密引擎可以根据表达式语句查询基准数据与符号串的映射关系,获得第三数据对应的符号串,也就是第一数据对应的符号串。
下面对上述过程进行举例说明:
对于对象类型的第一数据obj.method将其替换为字符串(即第二数据),即obj.method->obj[‘method’],将obj[‘method’]对应的节点作为父节点,将该字符串中的字符m、e、t、h、o、d分别作为该父节点的一个子节点,扩展出一棵子树,确定指向该子树上每个节点的字符,再确定字符对应的用基准数据表达时的表达式语句,将所确定的表达式语句在预设的基准数据与符号串的映射关系中进行查询,获得对象类型的数据obj.method对应的符号串,该符号串的一种实现方式具体如下:
this[(″[(((-[]))+″+(((-~-~[]<<-~″)+-~[]))+″)][((-~-~[]<<-~-~″)+(-~-~[]<<-~″)+-~-~″)]+″[(((-[]))+″+(((-~-~[]<<-~″)+-~[]))+″)][(-~″)]+″[(((-[]))+″+(((-~-~[]<<-~″)+-~[]))+″)][((-~-~″<<-~-~[])+-~″)])][(″[(((+[]))+″+(((-~-~″<<-~″)+-~″))+″)][((-~-~″<<-~-~[])+(-~-~″<<-~[]))]+″[(((+[]))+″+(((-~-~″<<-~″)+-~″))+″)][((-~-~[]<<-~″))]+″[(((+[]))+″+(((-~-~″<<-~″)+-~″))+″)][((-~-~″<<-~-~[]-~[])+-~-~″-~[])]+″[(((+[]))+″+(((-~-~″<<-~″)+-~″))+″)][((-~-~″<<-~[])+-~-~[]-~″)]+″[(((+[]))+″+(((-~-~″<<-~″)+-~″))+″)][((-~-~[]<<-~-~[])+(-~-~[]<<-~″)+-~-~[])]+″[(((+[]))+″+(((-~-~″<<-~″)+-~″))+″)][(-~-~[]-~[])])]
对于全局变量类型的第一数据a可以将其替换为字符串(即第二数据),即var a->this[‘a’],可以将this[‘a’]对应的节点作为父节点,将该字符串中的字符a作为该父节点的一个子节点,扩展出一棵子树,确定指向该子树上每个节点的字符,再确定字符对应的用基准数据表达时的表达式语句,将所确定的表达式语句在预设的基准数据与符号串的映射关系中进行查询,获得全局变量a对应的符号串,该符号串的一种实现方式具体如下:
this[″[(((+[]))+″+(((-~-~″<<-~″)+-~″))+″)][(-[])]]
对于字符串类型的第一数据‘abc’,可以先获取字符a,查找基准数据与字符串的映射关系,将字符a匹配中的基础数据(该基础数据也是字符a)对应的任一符号串,作为字符a对应的符号串;再获取字符b,查找基准数据与字符串的映射关系,将字符b匹配中的基础数据(该基础数据也就是字符b)对应的任一符号串,作为字符b对应的符号串;再获取字符c,查找基准数据与字符串的映射关系,将字符c匹配中的基础数据(该基础数据也就是字符c)对应的任一符号串,作为字符c对应的符号串,再将字符a、b、c对应的符号串进行拼接获得字符串‘abc’对应的符号串,该符号串的一种实现方式如下:
(″[(((-[]))+″+(((-~-~″<<-~″)+-~″))+″)][(-″)]+″[(((-[]))+″+(((-~-~″<<-~″)+-~''))+″)][(-~″)]+″[(((-[]))+″+(((-~-~″<<-~″)+-~″))+″)][(-~-~[])])
本发明以上实施例通过符号串代替脚本中需要且可以被加密的数据,使得加密后的脚本看起来更像一堆乱码,难以阅读,不容易被破解,提高了脚本的安全性。
图3为本发明一实施例提供的脚本解密方法的流程示意图。如图3所示,该方法包括:
301、获取待解密的加密脚本,该加密脚本包括需要且可以被解密的第一符号串。
302、根据上述第一符号串和预先配置的基准数据与符号串的映射关系,获取第一符号串对应的数据,基准数据是指由加密脚本对应的原始脚本使用的脚本语言的弱类型特性所确定的第一数据类型下可以直接映射到符号串的数据。
303、将上述第一符号串替换为上述第一符号串对应的数据,获得原始脚本。
首先说明,本实施例提供的加密脚本是指原始脚本经过加密获得的脚本。本实施例的方法适用于采用符号串进行加密的场景,本实施例中的加密脚本可以是采用图1所示方法加密获得的,但不限于此。本实施例涉及的符号串包括至少一个符号,所述符号可以是单位符号、数学符号、特殊符号以及标点符号等,例如可以是+、()、{}、[]、~、‘’等等。加密脚本中包括至少一个数据,这些数据中有些是经过加密的,有些是未经加密的,例如像运算符号、关键字等一般是未经加密的。为便于描述和区分,将加密脚本中经过符号串加密的数据记为第一符号串,加密脚本包括至少一个第一符号串。其中,在对加密脚本的解密过程中,对每个第一符号串的处理过程都相同。
其中,第一数据类型是指具有数据可以直接映射到符号串的数据类型,也就是说,该第一数据类型下一定有数据可以直接映射到符号串。为便于描述,本实施例将第一数据类型下可以直接映射到符号串的数据称为基准数据。值得说明的是,对于第一数据类型来说,可以是该数据类型下的所有数据都可以直接映射到符号串,也可以是该数据类型下的部分数据可以直接映射到符号串,这具体可由加密脚本对应的原始脚本所使用的脚本语言的弱类型特性决定。
其中,预先配置基准数据与符号串的映射关系的过程可参加图1所示实施例的描述,在此不再赘述。
在本实施例中,脚本解密引擎首先获取待解密的加密脚本,然后根据加密脚本中的第一符号串和预先配置的基准数据与符号串的映射关系,获得第一符号串对应的数据,将第一符号串替换为第一符号串对应的数据,当将所有第一符号串均替换为数据后,就得到原始脚本。
在一可选实施方式中,如图4所示,上述步骤302的一种实施过程包括:
3021、创建加密脚本的抽象语法树,第一符号串指向抽象语法树上的至少一个节点。
其中,脚本解密引擎可以借助开源工具esprima来创建抽象语法树,具体过程可参见现有技术,在此不再赘述。
值得说明的是,第一符号串可能对应抽象语法树上至少一个节点。
3022、按照由下往上的顺序,对抽象语法树上的节点进行组合处理,获得第二符号串。
基于前述加密过程中生成抽象语法树的过程,脚本解密引擎可以采用相反的方式实现解密。具体的,脚本解密引擎可以按照由下往上的顺序,将抽象语法树上的节点进行组合处理,具体是指对指向节点的符号串进行组合处理,以确定第二符号串。组合处理的方式具体为:对于叶子节点可以直接将其作为第二符号串;对于隶属于同一个父节点的子节点可以拼接起来得到指向该父节点的符号串,将该符号串作为第二符号串。
3023、根据上述第二符号串查询基准数据与符号串的映射关系,在查询到第二符号串对应的数据时,将第二符号串对应的数据作为第一符号串对应的数据。
在获得第二符号串之后,脚本解密引擎可以尝试根据第二符号串查询基准数据与符号串的映射关系,如果能够查询到第二符号串对应的数据,则说明第二符号串是需要且可以被解密的符号串,于是将第二符号串作为第一符号串,获得第一符号串对应的数据;如果不能查询到第二符号串对应的数据,说明该第二符号串可能是错误的,不属于需要且可以被解密的符号串,于是可以将其丢弃。
具体的,脚本解密引擎可以确定第二符号串用基准数据对应的符号串进行表示时的表达式语句;根据表达式语句查询基准数据与符号串的映射关系,在可以查询到第二符号串对应的数据时,确定第二符号串对应的数据为第一符号串对应的数据。
如果第二符号串本身为基准数据对应的符号串,则脚本解密引擎可以直接将第二符号串作为用基准数据对应的符号串进行表示时的表达式语句;如果第二符号串本身不是基准数据对应的符号串,则脚本解密引擎可以将第二符号串转换为用基准数据对应的符号串进行表示,获得用基准数据对应的符号串表示该第二符号串的表达式语句。
之后,脚本解密引擎可以根据第二符号串的表达式语句查询基准数据与符号串的映射关系,并在可以查询到第二符号串对应的数据时,确定第二符号串对应的数据为第一符号串对应的数据。
本实施例提供的脚本解密方法,用以对采用符号串进行加密的加密脚本进行解密,为基于符号串对原始脚本进行加密提供了支持,使得可以基于符号串对原始脚本加密,充分利用符号串本身比较晦涩,由符号串代表一定含义,一般无法直接从符号串中识别出该含义的特性,提高了脚本的安全性。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
图5为本发明一实施例提供的脚本加密引擎的结构示意图。如图5所示,该引擎包括:第一获取模块51、第二获取模块52和替换模块53。
第一获取模块51,用于获取待加密的原始脚本,原始脚本包括需要且可以被加密的第一数据。
第二获取模块52,与第一获取模块51连接,用于根据第一获取模块51获取的第一数据所属的数据类型和预先配置的基准数据与符号串的映射关系,获取第一数据对应的符号串,所述基准数据是指由原始脚本使用的脚本语言的弱类型特性所确定的第一数据类型下可以直接映射到符号串的数据,符号串包括至少一个符号。
替换模块53,与第二获取模块52连接,用于将第一数据替换为第二获取模块52获取的第一数据对应的符号串,获得加密脚本
在一可选实施方式中,如图6所示,第二获取模块52的一种实现结构包括:创建单元521、获取单元522和查询单元523。
创建单元521,与第一获取模块51连接,用于创建第一获取模块51获取的原始脚本的抽象语法树,第一数据指向抽象语法树上的一个节点。
获取单元522,与创建单元521连接,用于根据第一数据所属的数据类型与第一数据类型的匹配特性和第一数据指向的节点,获得抽象语法树上第一数据对应的可加密节点。
查询单元523,与获取单元522连接,用于根据获取单元522获取的第一数据对应的可加密节点查询基准数据与符号串的映射关系,获取第一数据对应的符号串。
获取单元522的一种实现结构包括:第一确定子单元和第二确定子单元。
第一确定子单元,用于在第一数据所属的数据类型与第一数据类型相匹配时,确定第一数据指向的节点为第一数据对应的可加密节点;
第二确定子单元,用于在第一数据所属的数据类型与第一数据类型不匹配时,对第一数据进行表达方式的等价替换,获得含义与第一数据相同但数据类型与第一数据类型相匹配的第二数据,将第二数据指向的节点扩展为一棵子树,将子树的节点作为第一数据对应的可加密节点。
在一可选实施方式中,第一数据类型为包括字符串类型的常量类型。基于此,第二确定子单元具体用于在第一数据所属的数据类型与第一数据类型不匹配时,对第一数据进行表达方式的等价替换,获得含义与第一数据相同但数据类型为字符串类型的第二数据,以第二数据指向的节点为父节点,将第二数据中的每个字符扩展为父节点的一个子节点,获得子树,将子树的节点作为第一数据对应的可加密节点。
在一可选实施方式中,查询单元523具体可用于确定指向第一数据对应的可加密节点的第三数据,确定第三数据用基准数据进行表示时的表达式语句,根据表达式语句查询基准数据与符号串的映射关系,获得第一数据对应的符号串。
具体的,查询单元523可用于在第一数据所属的数据类型与第一数据类型相匹配时,直接将第一数据作为指向该可加密节点的第三数据;以及在第一数据所属的数据类型与第一数据类型不匹配时,将扩展后指向该可以加密节点的数据作为第三数据。
基于上述将第一数据等价变换为字符串的实施方式,查询单元523可用于将字符串类型的第二数据中的字符分别作为指向对应的可加密节点的数据。
进一步,查询单元523可用于在第三数据本身为基准数据时,直接将第三数据本身作为第三数据用基准数据进行表示时的表达式语句;以及在第三数据本身不是基准数据时,可以将第三数据转换为用基准数据表示,获得用基准数据表示该第三数据的表达式语句。
进一步,查询单元523可用于在第三数据能够直接用基准数据进行表示时,则直接用基准数据表示第三数据,获得用基准数据表示该第三数据的表达式语句;以及在第三数据不能够直接用基准数据进行表示时,则可以先对第三数据进行编码转换,获得可以直接用基准数据表示且含义相同的第四数据,然后再直接用基准数据表示第四数据,获得用基准数据表示该第三数据的表达式语句。
本实施例提供的脚本加密引擎,预先配置基准数据与符号串的映射关系,根据加密脚本中数据所属的数据类型和基准数据与符号串的映射关系,获取该数据对应的符号串,用符号串替换数据,达到对脚本加密的目的。其中,符号串本身比较晦涩,利用符号串代表一定含义,一般无法直接从符号串中识别出该含义,而本实施例提供的脚本加密引擎利用符号串对原始脚本加密,使得加密后的脚本直观看起来更像是一堆乱码,完全掩盖了脚本原本的意图和过程,极难被阅读理解并破解,因此提高了脚本的安全性。
图7为本发明一实施例提供的脚本解密引擎的结构示意图。如图7所示,该引擎包括:第一获取模块71、第二获取模块72和替换模块73。
第一获取模块71,用于获取待解密的加密脚本,加密脚本包括需要且可以被解密的第一符号串。
第二获取模块72,与第一获取模块71连接,用于根据第一获取模块71获取的加密脚本中的第一符号串和预先配置的基准数据与符号串的映射关系,获取第一符号串对应的数据,基准数据是指由加密脚本对应的原始脚本使用的脚本语言的弱类型特性所确定的第一数据类型下可以直接映射到符号串的数据。
替换模块73,与第二获取模块72连接,用于将第一符号串替换为第二获取模块72获取的第一符号串对应的数据,获得原始脚本。
在一可选实施方式中,如图8所示,第二获取模块72包括:创建单元721、第一获取单元722和第二获取单元723。
创建单元721,用于创建加密脚本的抽象语法树,第一符号串指向抽象语法树上的至少一个节点。
第一获取单元722,与创建单元721连接,用于按照由下往上的顺序,对抽象语法数据上的节点进行组合,获得第二符号串。
第二获取单元723,与第一获取单元721连接,用于根据第一获取单元722获取的第二符号串查询基准数据与符号串的映射关系,在查询到第二符号串对应的数据时,将第二符号串对应的数据作为第一符号串对应的数据。
在一可选实施方式中,第二获取单元723具体用于确定第二符号串用基准数据对应的符号进行表示时的表达式语句,根据第二符号串的表达式语句查询基准数据与符号串的映射关系,在查询到第二符号串对应的数据时,将第二符号串对应的数据作为第一符号串对应的数据。
本实施例提供的脚本解密引擎,可用于对采用符号串进行加密的脚本进行解密,为基于符号串对原始脚本进行加密提供了支持,使得可以基于符号串对原始脚本加密,充分利用符号串本身比较晦涩,由符号串代表一定含义,一般无法直接从符号串中识别出该含义的特性,提高了脚本的安全性。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本发明所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。