node 加密解密模块_一种Node.js的代码加密及底层运行时解密办法的制作方法

本发明涉及加解密领域,具体涉及一种Node.js的代码加密及底层运行时解密办法。

背景技术:

由于JavaScript(后简称:JS)为动态语言,其代码无法被预先编译,而是以文本可读形式保存,因而其源代码无法得到有效保护。近年来,JS技术演变出Webpack、Gulp等混淆打包工具,能够将JS项目打包成用户不可理解的混淆代码,但此种方法治标不治本,混淆后的代码仍然是可被二次修改的代码,甚至有反混淆工具能够在一定程度上逆向混淆,配合JS强大的内部调试,用户可以轻松地推导出代码逻辑,或对其进行修改,因而,采用混淆的伪“加密”无法保证代码的安全性,这也是Node.js成为大规模商业服务语言选型的最大阻碍。

本发明基于C为Node.js编写了一种解密运行时扩展,能够在底层实时解密JS代码并绕过Node.js直接经由底层V8引擎执行代码,解密过程、执行过程用户均无法查看或干预,有效地保证了代码的安全。

技术实现要素:

本发明所要解决的技术问题是现有技术中存在的JS源代码无法得到有效保护的技术问题。提供了一种新的Node.js的代码加密及底层运行时解密办法,较好地保障了JS源代码的保密性,可用于Node.js代码保护、防止二次修改等应用场景。

为解决上述技术问题,采用的技术方案如下:

一种Node.js的代码加密及底层运行时解密办法,所述Node.js的代码加密办法包括:

步骤一,命令行运行加密助手程序,载入C编译的加密扩展模块,调用模块内部的加密程序,传入待加密文件列表,以及解密的密钥保存路径;

步骤二,加密扩展模块使用JS混淆算法对待加密文件进行代码混淆,生成混淆代码;

步骤三,加密扩展模块生成一套RSA公私钥匙对,利用RSA非对称加解密方法,使用私钥对步骤二生成的混淆代码做第一次加密,生成密文;

步骤四,加密扩展模块使用内部的文本加密算法对步骤三生成的密文做第二次加密,并将二次加密的密文覆盖源JS文件后生成加密后的JS文件;同时,使用所述文本加密算法对步骤三生成的RSA公钥进行加密,存为解密的密钥文件。

本发明的工作原理:本发明与采用代码混淆的伪“加密”不同,本发明能够将JS文件直接加密成完全不可读的密文,经过加密的代码无法被解密、修改,或是直接运行。通过本办法执行任何一次加密动作之后,解密的密钥均会发生变化,因而一套加密的代码能享有唯一的解密的密钥,同一次加密的一套代码无法被被扩充、篡改。加密后的代码仅能通过执行助手程序执行。

上述方案中,配合加密步骤,进一步地,所述Node.js的底层运行时解密办法还包括:

步骤五,命令行运行执行助手程序,指定入口文件和解密的密钥文件;

步骤六,Node.js环境下获取Node.js全局变量,其中包含:__dirname—入口文件所在目录;__filename—入口文件路径;module、require—CommonJS模块化依赖;

步骤七,执行助手程序载入C编译的底层运行时解密扩展模块,调用运行时解密扩展模块的解密程序,传入入口文件对应路径、解密的密钥文件对应路径、以及步骤六获取的Node.js全局变量;

步骤八,将用于实时解密的钩子函数注入到全局变量的require中,使得入口文件能够引入加密JS模块文件,入口文件仅能够引入能通过步骤十得到的密钥进行解密的加密JS模块文件;

步骤九,运行时解密扩展模块生成全局变量初始化JS代码,并通过V8引擎底层快速通道编译、执行,在快速通道执行环境中模拟Node环境;

步骤十,运行时解密扩展模块读取入口文件和解密的密钥,使用内部的文本解密算法将入口文件和解密的密钥,做第一次解密,得到入口文件的密文和解密后的公钥或私钥;

步骤十一,运行时解密扩展模块使用解密后的密钥或公钥,利用RSA非对称加解密方法,对入口文件的密文进行第二次解密,得到混淆代码;

步骤十二,运行时解密扩展模块通过V8引擎底层快速通道编译、执行步骤十一得到的混淆代码,并在执行完毕后返回执行结果。

进一步地,所述运行时解密扩展模块不是由JS编写的常规模块,而是使用C编写、编译的原生模块。

进一步地,加密后的文件无法直接通过Node.js执行,且无法二次修改,仅可以通过执行助手程序配合底层运行时解密扩展进行实时解密执行。

进一步地,解密操作在C编译的运行时解密扩展模块中完成,整个解密过程及解密结果无法被用户观察。

进一步地,C编译的运行时解密扩展模块能够通过V8引擎底层快速通道模拟Node执行环境,并直接通过该快速通道运行解密后的代码,用户无法对解密代码的运行过程进行干预。

本发明的有益效果:本发明与采用代码混淆的伪“加密”不同,本发明能够将JS文件直接加密成完全不可读的密文,经过加密的代码无法被解密、修改,或是直接运行。通过本办法执行任何一次加密动作之后,解密的密钥均会发生变化,因而一套加密的代码能享有唯一的解密的密钥,同一次加密的一套代码无法被被扩充、篡改。加密后的代码仅能通过执行助手程序执行。本发明基于C为Node.js编写了一种解密运行时扩展,能够在底层实时解密JS代码并绕过Node.js直接经由底层V8引擎执行代码,解密过程、执行过程用户均无法查看或干预,有效地保证了代码的安全。

附图说明

下面结合附图和实施例对本发明进一步说明。

图1,实施例1中的加密过程。

图2,实施例1中的解密过程。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

实施例1

本实施例提供一种Node.js的代码加密及底层运行时解密办法,如图1,所述Node.js的代码加密办法包括:

步骤一,命令行运行加密助手程序,载入C编译的加密扩展模块,调用模块内部的加密程序,传入待加密文件列表,以及解密的密钥保存路径;

步骤二,加密扩展模块使用JS混淆算法对待加密文件进行代码混淆,生成混淆代码;

步骤三,加密扩展模块生成一套RSA公私钥匙对,利用RSA非对称加解密方法,使用私钥对步骤二生成的混淆代码做第一次加密,生成密文;

步骤四,加密扩展模块使用内部的文本加密算法对步骤三生成的密文做第二次加密,并将二次加密的密文覆盖源JS文件后生成加密后的JS文件;同时,使用所述文本加密算法对步骤三生成的RSA公钥进行加密,存为解密的密钥文件。

本实施例与采用代码混淆的伪“加密”不同,本实施例能够将JS文件直接加密成完全不可读的密文,经过加密的代码无法被解密、修改,或是直接运行。通过本办法执行任何一次加密动作之后,解密的密钥均会发生变化,因而一套加密的代码能享有唯一的解密的密钥,同一次加密的一套代码无法被被扩充、篡改。加密后的代码仅能通过执行助手程序执行。

具体地,如图2,所述Node.js的底层运行时解密办法还包括:

步骤五,命令行运行执行助手程序,指定入口文件和解密的密钥文件;

步骤六,Node.js环境下获取Node.js全局变量,其中包含:__dirname—入口文件所在目录;__filename—入口文件路径;module、require—CommonJS模块化依赖;

步骤七,执行助手程序载入C编译的底层运行时解密扩展模块,调用运行时解密扩展模块的解密程序,传入入口文件对应路径、解密的密钥文件对应路径、以及步骤六获取的Node.js全局变量;

步骤八,将用于实时解密的钩子函数注入到全局变量的require中,使得入口文件能够引入加密JS模块文件,入口文件仅能够引入能通过步骤十得到的密钥进行解密的加密JS模块文件;

步骤九,运行时解密扩展模块生成全局变量初始化JS代码,并通过V8引擎底层快速通道编译、执行,在快速通道执行环境中模拟Node环境;

步骤十,运行时解密扩展模块读取入口文件和解密的密钥,使用内部的文本解密算法将入口文件和解密的密钥,做第一次解密,得到入口文件的密文和解密后的公钥或私钥;

步骤十一,运行时解密扩展模块使用解密后的密钥或公钥,利用RSA非对称加解密方法,对入口文件的密文进行第二次解密,得到混淆代码;

步骤十二,运行时解密扩展模块通过V8引擎底层快速通道编译、执行步骤十一得到的混淆代码,并在执行完毕后返回执行结果。

具体地,所述运行时解密扩展模块不是由JS编写的常规模块,而是使用C编写、编译的原生模块。

具体地,加密后的文件无法直接通过Node.js执行,且无法二次修改,仅可以通过执行助手程序配合底层运行时解密扩展进行实时解密执行。

具体地,解密操作在C编译的运行时解密扩展模块中完成,整个解密过程及解密结果无法被用户观察。

具体地,C编译的运行时解密扩展模块能够通过V8引擎底层快速通道模拟Node执行环境,并直接通过该快速通道运行解密后的代码,用户无法对解密代码的运行过程进行干预。

本实施例基于C为Node.js编写了一种解密运行时扩展,能够在底层实时解密JS代码并绕过Node.js直接经由底层V8引擎执行代码,解密过程、执行过程用户均无法查看或干预,有效地保证了代码的安全。

尽管上面对本发明说明性的具体实施方式进行了描述,以便于本技术领域的技术人员能够理解本发明,但是本发明不仅限于具体实施方式的范围,对本技术领域的普通技术人员而言,只要各种变化只要在所附的权利要求限定和确定的本发明精神和范围内,一切利用本发明构思的发明创造均在保护之列。

你可能感兴趣的:(node,加密解密模块)