应用于python项目的加密保护方法
技术领域
1.本公开的实施例一般涉及数据加密领域,并且更具体地,涉及应用于python项目的加密保护方法、装置、设备和计算机可读存储介质。
背景技术:
2.python简单易用,标准库和第三方库众多,功能强大等优点,选择python开发的人越来越多,但由于python 自身动态特性和开源特点,很难对python项目的源码进行很好的加密防护,尤其是基于python开发的商业项目,若要对项目进行打包分发,又要防止源码泄漏或破解,目前已知的几种python源码保护方式都无法满足商业保护的要求。
3.目前已经存在的python源码保护方式主要有发行.pyc文件、代码混淆、使用cython、定制python解释器等。下面详细阐述现有方法的优缺点。
4.(1)发行.pyc该方法是将.py源码文件进行编译直接生成.pyc文件。
5.优点:简单方便,python标准库中提供了compileall库,可以轻松的进行编译,提高了一点源码破解难度,且平台兼容性好,.py可以运行的地方,.pyc就能在那里运行。
6.缺点:解释器兼容性差,只能在特定版本的解释器上运行,针对.pyc文件,有现成的反编译工具,破解难度和成本低。
7.(2)代码混淆将.py源码文件经过一定的技术手段进行转换或增加无效代码等方式,将原先可读性较强的源码变成可读性很差甚至难以理解以达到源码保护的目的。
8.优点:简单方便,提高了源码破解门槛,兼容性好,只要源码可以运行,混淆代码也可运行。
9.缺点:只能针对单个文件混淆,无法做到多个有联系的源码文件联动混淆,且代码结构未发生改变,会生成.pyc文件,破解难度低。
10.(3)使用cython通过cython这个工具将 .py/.pyx 编译为 .c 文件,再将 .c 文件编译为 .so(unix) 或 .pyd(windows)格式的文件,源码文件经过二次编译转换后,大大提高了破解的难度。
11.优点:生成二进制.so或.pyd文件,难破解,同时也提升了性能。
12.缺点:兼容性稍差,对于不同版本的操作系统,可能需要重新编译,虽然支持大多数 python 代码,因涉及到二次编译,一旦发现部分代码无法编译或无法支持,后续的完善成本较高。
13.(4)定制python解释器采用对称加密(des、3des、aes等)方法对源码文件进行加密,同时对加密密钥采用非对称加密方法(rsa、elgamal等)进行再次加密,并将加密过的密钥随同加密文件一同打包分发,为了便于对加密密钥和加密文件进行解密和执行,需要对python解释器进行修改
和定制。
14.优点:使用对称加密算法,破解难度提升;兼容性好,源码可以运行的地方,加密后的代码也能运行。
15.缺点:需要修改和定制python解释器,否则无法进行解密和执行,同时文件运行时会生成.pyc文件,需要在解释器屏蔽生成.pyc文件,处理方式比较复杂。
技术实现要素:
16.根据本公开的实施例,提供了一种应用于python项目的加密保护方案。
17.在本公开的第一方面,提供了一种应用于python项目的加密保护方法。该方法包括:获取python项目;遍历所述python项目,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串;对所述密文字符串进行编码,保存到加密目录下的同名文件夹,完成对所述python项目的加密。
18.进一步地,所述遍历所述python项目,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串包括:获取密码key和python解码器;遍历所述python项目,对所述python项目目录进行加密;加载所述python解码器的aes模块,对所述密码key进行处理,得到新的密钥,并传入所述aes模块;遍历加密后的python项目目录,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串。
19.进一步地,所述对所述密码key进行处理,得到新的密钥包括:通过md5对所述密码key进行处理,得到256位的新的密钥。
20.进一步地,所述对所述密文字符串进行编码包括:对所述密文字符串进行base64编码。
21.在本公开的第二方面,提供了一种应用于python项目的解密及执行方法。该方法包括:获取加密的python项目;遍历所述加密的python项目,读取项目中.pyt文件的内容,并对其进行解码,得到aes加密后的原始秘文;通过aes算法对所述原始秘文进行解密,得到python代码明文,并放入解密队列中;将解密队列中的 python代码明文编译为可执行的代码模块,执行所述代码模块,制作与其对应的项目路径的模块名称;将所述代码模块和与其对应的模块名称,存储到python的全局字典中;基于预设规则,修改启动文件模块的名称,调用所述python的全局字典,运行python项目。
22.在本公开的第三方面,提供了一种应用于python项目的加密保护装置。该装置包括:获取模块,用于获取python项目;加密模块,用于遍历所述python项目,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串;编码模块,用于对所述密文字符串进行编码,保存到加密目录下的同名文件夹,完成对所述python项目的加密。
23.在本公开的第四方面,提供了一种电子设备。该电子设备包括:存储器和处理器,所述存储器上存储有计算机程序,所述处理器执行所述程序时实现如以上所述的方法。
24.在本公开的第五方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现如根据本公开的第一和/或第二方面的方法。
25.本技术实施例提供的应用于python项目的加密保护方法,通过获取python项目;遍历所述python项目,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串;对所述密文字符串进行编码,保存到加密目录下的同名文件夹,完成对所述python项目的加密,有效防止了源码泄漏和被非法破解,可以满足基于python开发的商业项目的保护要求。
26.应当理解,发明内容部分中所描述的内容并非旨在限定本公开的实施例的关键或重要特征,亦非用于限制本公开的范围。本公开的其它特征将通过以下的描述变得容易理解。
附图说明
27.结合附图并参考以下详细说明,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。在附图中,相同或相似的附图标记表示相同或相似的元素,其中:图1示出了能够在其中实现本公开的实施例的示例性运行环境的示意图;图2示出了根据本公开的实施例的应用于python项目的加密保护方法的流程图;图3示出了根据本公开的实施例的应用于python项目的解密及执行方法的流程图;图4示出了根据本公开的实施例的应用于python项目的加密保护装置的方框图;图5示出了能够实施本公开的实施例的示例性电子设备的方框图。
具体实施方式
28.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的全部其他实施例,都属于本公开保护的范围。
29.另外,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
30.图1示出了可以应用本技术的应用于python项目的加密保护方法或应用于python
项目的加密保护装置的实施例的示例性系统架构100。
31.如图1所示,系统架构100可以包括终端设备101、102、103,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
32.用户可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送消息等。终端设备101、102、103上可以安装有各种通讯客户端应用,例如模型训练类应用、视频识别类应用、网页浏览器应用、社交平台软件等。
33.终端设备101、102、103可以是硬件,也可以是软件。当终端设备101、102、103为硬件时,可以是具有显示屏的各种电子设备,包括但不限于智能手机、平板电脑、电子书阅读器、mp3播放器(moving picture experts group audio layer iii,动态影像专家压缩标准音频层面3)、mp4(moving picture experts group audio layer iv,动态影像专家压缩标准音频层面4)播放器、膝上型便携计算机和台式计算机等等。当终端设备101、102、103为软件时,可以安装在上述所列举的电子设备中。其可以实现成多个软件或软件模块(例如用来提供分布式服务的多个软件或软件模块),也可以实现成单个软件或软件模块。在此不做具体限定。
34.当终端101、102、103为硬件时,其上还可以安装有视频采集设备。视频采集设备可以是各种能实现采集视频功能的设备,如摄像头、传感器等等。用户可以利用终端101、102、103上的视频采集设备来采集视频。
35.服务器105可以是提供各种服务的服务器,例如对终端设备101、102、103上显示的数据处理的后台服务器。后台服务器可以对接收到的数据进行分析等处理,并可以将处理结果反馈给终端设备。
36.需要说明的是,服务器可以是硬件,也可以是软件。当服务器为硬件时,可以实现成多个服务器组成的分布式服务器集群,也可以实现成单个服务器。当服务器为软件时,可以实现成多个软件或软件模块(例如用来提供分布式服务的多个软件或软件模块),也可以实现成单个软件或软件模块。在此不做具体限定。
37.应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。特别地,在目标数据不需要从远程获取的情况下,上述系统架构可以不包括网络,而只包括终端设备或服务器。
38.如图2所示,是本技术实施例应用于python项目的加密保护方法的流程图。通过指定本地python解释器,获取传入的参数key,以及需要加密的python项目,使用aes加密方式对.py源码文件按照其目录结构进行加密,生成与源码.py文件名称一一对应的.pyt文件,即文件名称和目录结构保持不变,.py文件加密后变成.pyt文件。从图2中可以看出,本实施例的应用于python项目的加密保护方法,包括以下步骤:s210,获取python项目。
39.在本实施例中,用于应用于python项目的加密保护方法的执行主体(例如图1所示的服务器)可以通过有线方式或者无线连接的方式获取python项目。
40.进一步地,上述执行主体可以获取与之通信连接的电子设备(例如图1所示的终端设备)发送的python项目,也可以是预先存储于本地的python项目。
41.s220,遍历所述python项目,读取项目中源码文件的内容,并通过aes加密算法对
该内容进行加密,得到密文字符串。
42.获取密码key和python解码器;所述密码key可根据实际应用场景进行预先设定;遍历所述python项目,在指定(同级)目录下生成加密后的python项目目录,目录结构与原项目的目录结构保持一致,将源项目下的非.py文件直接拷贝到加密后对应的项目目录中;加载所述python解码器的aes模块,通过md5对所述密码key进行处理,得到256位的新的密钥,并传入所述aes模块;遍历源项目目录,读取项目中源码文件的内容(.py源码文件的内容),并通过aes加密算法对该内容进行加密,得到密文字符串。
43.s230,对所述密文字符串进行编码,保存到加密目录下的同名文件夹,完成对所述python项目的加密。
44.在一些实施例中,对所述密文字符串进行base64编码,保存到加密目录下的同名文件中,文件类型变为.pyt。即,完成对python项目下.py文件的加密。
45.根据本公开的又一实施例,公开了一种与应用于python项目的加密保护方法,对应的应用于python项目的解密及执行方法。从图3中可以看出,本实施例的应用于python项目的解密及执行方法,包括以下步骤:s310,获取加密的python项目。
46.获取通过步骤s210-230加密的python项目。
47.s320,遍历所述加密的python项目,读取项目中.pyt文件的内容,并对其进行解码,得到aes加密后的原始秘文。
48.获取密码key和python解码器;使用所述解释器加载aes模块,通过md5对所述key进行处理,生成256位密钥,并传入aes模块中;遍历当前密文项目,读取目录下.pyt文件获取密文内容;对其进行base64解码,获得aes加密后的原始密文。
49.s330,通过aes算法对所述原始秘文进行解密,得到python代码明文,并放入解密队列中。
50.在一些实施例中,采用aes算法和密钥对原始密文进行解密,获得python代码明文,放入解密队列中。
51.s340,将解密队列中的 python代码明文编译为可执行的代码模块,执行所述代码模块,制作与其对应的项目路径的模块名称;将所述代码模块和与其对应的模块名称,存储到python的全局字典中。
52.在一些实施例中,从所述解密队列中,获取python代码明文。使用importlib.abc模块将代码明文编译为可执行的代码模块,执行失败的明文放入队列尾部,执行成功的则根据当前文件路径,制作相对于项目路径的模块名称,将模块名称和模块以字典形式存储到python内置模块sys.modules中(全局字典),直到队列为空或失败次数大于文件个数结束。
53.s350,基于预设规则,修改启动文件模块的名称,调用所述python的全局字典,运行python项目。
54.在一些实施例中,更改启动文件模块名称为“__main__”(参考main函数的运行规则),并调用该模块,通过代码运行启动文件的入口,python解析器自动加载项目运行所需的模块,将依次在sys.modules查找导入模块,运行python项目。
55.根据本公开的实施例,实现了以下技术效果:本发明采用aes对称加密方式对python源码进行加密保护,大大提升破解的门槛和难度,代码执行过程中不会产生.pyc文件,从而达到防止源码泄露的目的,本发明不需要修改和定制python解释器,并可很好的兼容windows平台和linux平台,适合基于python开发的商业项目的打包分发。
56.本公开采用的加密算法为aes对称加密算法,模式为cbc模式,使用256位长度的key作为密钥,通过python解释器(该解释器需要安装pycryptodome库)对文件进行加密,最终将项目目录下的所有源码.py文件加密生成一一对应的.pyt的密文文件。
57.源码文件经过加密后,正常模式下是无法进行自动解密和执行的,正常python项目的执行过程如下:python解释器对python项目进行执行时,首先需要进行导包,python导包的顺序为:以当前项目路径为首,保存在sys.path中,当执行到某个陌生包文件时,根据其模块名,python会先到项目目录下去查找此文件,若目录下不存在此文件,则去其他路径(内部包)查找文件,将文件生成模块加载到sys.modules中,然后再执行。
58.本公开的解密过程遵循上述步骤流程,但无需查找sys.path,而是将文件以当前项目路径作为相对路径,把目录下的密文解密得到的明文字串,通过python内部标准库把得到的明文字符串直接编译为可直接运行的模块,根据文件相对位置对模块进行命名,直接添加到sys.modules中,此方法既不会影响程序的运行速度,反而会提前把所需要的包导入内置模块中,方便程序更快加载模块,提升了项目的执行速度。
59.需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本公开并不受所描述的动作顺序的限制,因为依据本公开,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本公开所必须的。
60.以上是关于方法实施例的介绍,以下通过装置实施例,对本公开所述方案进行进一步说明。
61.图4示出了根据本公开的实施例的应用于python项目的加密保护装置400的方框图。如图4所示,装置400包括:获取模块410,用于获取python项目;加密模块420,用于遍历所述python项目,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串;编码模块430,用于对所述密文字符串进行编码,保存到加密目录下的同名文件夹,完成对所述python项目的加密。
62.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,所述描述的模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
63.图5示出了可以用来实施本公开的实施例的电子设备500的示意性框图。如图所
示,设备500包括中央处理单元(cpu)501,其可以根据存储在只读存储器(rom)502中的计算机程序指令或者从存储单元508加载到随机访问存储器(ram)503中的计算机程序指令,来执行各种适当的动作和处理。在ram503中,还可以存储设备500操作所需的各种程序和数据。cpu 501、rom 502以及ram 503通过总线504彼此相连。输入/输出(i/o)接口505也连接至总线504。
64.设备500中的多个部件连接至i/o接口505,包括:输入单元506,例如键盘、鼠标等;输出单元507,例如各种类型的显示器、扬声器等;存储单元508,例如磁盘、光盘等;以及通信单元509,例如网卡、调制解调器、无线通信收发机等。通信单元509允许设备500通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
65.处理单元501执行上文所描述的各个方法和处理。例如,在一些实施例中,方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元508。在一些实施例中,计算机程序的部分或者全部可以经由rom 502和/或通信单元509而被载入和/或安装到设备500上。当计算机程序加载到ram 503并由cpu 501执行时,可以执行上文描述的方法的一个或多个步骤。备选地,在其他实施例中,cpu 501可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行方法。
66.本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(fpga)、专用集成电路(asic)、专用标准产品(assp)、芯片上系统的系统(soc)、负载可编程逻辑设备(cpld)等等。
67.用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
68.在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或快闪存储器)、光纤、便捷式紧凑盘只读存储器(cd-rom)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
69.此外,虽然采用特定次序描绘了各操作,但是这应当理解为要求这样操作以所示出的特定次序或以顺序次序执行,或者要求所有图示的操作应被执行以取得期望的结果。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实现中。相反地,在单个实现的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实现中。
70.以上描述仅为本技术的较佳实施例以及对所运用技术原理的说明。本领域技术人
员应当理解,本技术中所涉及的申请范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离前述申请构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本技术中申请的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
技术特征:
1.一种应用于python项目的加密保护方法,其特征在于,包括:获取python项目;遍历所述python项目,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串;对所述密文字符串进行编码,保存到加密目录下的同名文件夹,完成对所述python项目的加密。2.根据权利要求1所述的方法,其特征在于,所述遍历所述python项目,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串包括:获取密码key和python解码器;遍历所述python项目,对所述python项目目录进行加密;加载所述python解码器的aes模块,对所述密码key进行处理,得到新的密钥,并传入所述aes模块;遍历加密后的python项目目录,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串。3.根据权利要求2所述的方法,其特征在于,所述对所述密码key进行处理,得到新的密钥包括:通过md5对所述密码key进行处理,得到256位的新的密钥。4.根据权利要求3所述的方法,其特征在于,所述对所述密文字符串进行编码包括:对所述密文字符串进行base64编码。5.一种应用于python项目的解密及执行方法,其特征在于,包括:获取加密的python项目;遍历所述加密的python项目,读取项目中.pyt文件的内容,并对其进行解码,得到aes加密后的原始秘文;通过aes算法对所述原始秘文进行解密,得到python代码明文,并放入解密队列中;将解密队列中的 python代码明文编译为可执行的代码模块,执行所述代码模块,制作与其对应的项目路径的模块名称;将所述代码模块和与其对应的模块名称,存储到python的全局字典中;基于预设规则,修改启动文件模块的名称,调用所述python的全局字典,运行python项目。6.根据权利要求5所述的方法,其特征在于,所述对所述加密内容进行解码包括:对所述加密内容进行base64解码。7.根据权利要求6所述的方法,其特征在于,所述预设规则包括main函数的运行规则。8.一种应用于python项目的加密保护装置,其特征在于,包括:获取模块,用于获取python项目;加密模块,用于遍历所述python项目,读取项目中源码文件的内容,并通过aes加密算法对该内容进行加密,得到密文字符串;编码模块,用于对所述密文字符串进行编码,保存到加密目录下的同名文件夹,完成对所述python项目的加密。9.一种电子设备,包括存储器和处理器,所述存储器上存储有计算机程序,其特征在
于,所述处理器执行所述程序时实现如权利要求1~7中任一项所述的方法。10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1~7中任一项所述的方法。
技术总结
本公开的实施例提供了应用于Python项目的加密保护方法、装置、设备和计算机可读存储介质。所述方法包括获取Python项目;遍历所述Python项目,读取项目中源码文件的内容,并通过AES加密算法对该内容进行加密,得到密文字符串;对所述密文字符串进行编码,保存到加密目录下的同名文件夹,完成对所述Python项目的加密。以此方式,可以有效防止源码泄漏和被非法破解。法破解。法破解。
技术研发人员:杜邦豪 张永元
受保护的技术使用者:北京天防安全科技有限公司
技术研发日:2022.02.09
技术公布日:2022/3/8