一种Python远程加密执行方案的制作方法
未命名
08-07
阅读:80
评论:0

一种python远程加密执行方案
技术领域
1.本发明属于计算机技术领域,具体地说,涉及一种python远程加密执行方案。
背景技术:
2.python是当前cg行业最为广泛使用的语言,但python编写的程序是本地引用,明文存储的,在一些特定情形,尤其是在外包流程中,资产外包方希望能够做到:
3.1.将内部工具给供应商(外包商),但只开放使用权,不泄露源码。
4.2.避免每次工具更新都要供应商手动更新。实际生产中经常会出现一天更新多次工具,每次包含了若干文件,影响几十个供应商的上百台电脑,人力更新非常繁琐。
5.3.更加灵活的鉴权控制。比如在外包合同突然终止后希望可以收回工具的使用权,避免使用此工具接其他外包方的单。
6.现有方案多利用pyc、cython、pyarmor,但是pyc模块极其容易被反编译为py;cython自身不存在鉴权功能,只要拿到pyd模块即可使用,除此之外仍然存在更新繁琐的问题;pyarmor提供的鉴权机制为静态的,即证书一旦发出不可收回。对于发包的情形,在合作临时终止后python脚本仍然可以在外包方使用,而且和cython一样存在更新繁琐的问题。
7.有鉴于此特提出本发明。
技术实现要素:
8.本发明要解决的技术问题在于克服现有技术的不足,提供一种python远程加密执行方案。为解决上述技术问题,本发明采用技术方案的基本构思是:
9.一种python远程加密执行方案,包括:
10.客户端构建钩子类对用户导入模块请求进行判断,所述构子类具备find_module方法和load_module方法,且在导入处理顺序的优先级最高;
11.客户端向服务器端发送鉴权请求,所述鉴权请求经服务器端判断并返回鉴权结果会话;
12.客户端在所述鉴权请求通过后向服务器端发送包体请求;
13.服务器端从包的仓库中检索包体的存储位置,对包体进行加密处理并向客户端返回密文;
14.客户端利用私钥对密文进行解密,将解密后的包体解压缩后接入python import系统并执行代码。
15.进一步地,鉴权的方式为http鉴权,即服务器端接受用户的token并返回会话,所述会话包括是否合法和过期。
16.进一步地,包体请求发生在在实际的import执行阶段,包括客户端通过触发find_module方法进行本地模块查找的判断及通过触发load_module方法向服务器端发送下载请求。
17.进一步地,加密处理包括利用公钥对打包的包体进行rsa加密,并返回加密后的字
节密文。
18.进一步地,解密包括接收服务器端返回的密文,通过秘钥对其解密获得包含模块的包体,将包体解压缩后的模块源码执行导入。
19.进一步地,接入python import系统通过代码托管平台实现服务器端仓库代码的初始化和更新。
20.采用上述技术方案后,本发明与现有技术相比具有以下有益效果。
21.本发明把代码远程执行和保护结合到了一起,在常见的需要将工具外用的场景,本发明提供的方案极大的节省代码更新对代码提供者和使用者带来的时间,且代码更新后使用者下次导入模块即为最新版,无需多余的操作。另外由于动态的鉴权机制,可以随时控制每用户的对工具的可用性,在实际实现时和其他管理项(比如项目有效性)关联在一起,能达到更好的控制体验。鉴于本发明把所有的客户端实现都封装到了一个模块,对原有代码的入侵程度很小。
22.应当理解,发明内容部分中所描述的内容并非旨在限定本公开的实施例的关键或重要特征,亦非用于限制本公开的范围。本公开的其它特征将通过以下的描述变得容易理解。下面结合附图对本发明的具体实施方式作进一步详细的描述。
附图说明
23.附图作为本技术的一部分,用来提供对本发明的进一步的理解,本发明的示意性实施例及其说明用于解释本发明,但不构成对本发明的不当限定。显然,下面描述中的附图仅仅是一些实施例,对于本领域普通技术人员来说,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。在附图中:
24.图1是根据本公开的一个实施例的调用周期流程图。
25.需要说明的是,这些附图和文字描述并不旨在以任何方式限制本发明的构思范围,而是通过参考特定实施例为本领域技术人员说明本发明的概念。
具体实施方式
26.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的全部其他实施例,都属于本公开保护的范围。
27.另外,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
28.实施例一
29.如图1所示,本实施例所述的一种python远程加密执行方案,包括:用户导入模块、客户端模块、服务器端模块,用户导入模块包括钩子类的构建和优先级;客户端模块负责发起鉴权请求、包体请求、以及包体的解密;服务器端模块负责返回鉴权结果、包体加密和返回密文。
30.用户导入模块按照python对钩子类的接口要求为:具备find_module方法,用于判
定是否能在此钩子中找到请求的模块;具备load_module方法,用于在找到请求的模块后执行实际的导入工序,即执行模块代码并扩展sys.modules。凡是满足条件的类都可以被当做钩子类来镶嵌到python的import处理过程中,本方案客户端的核心钩子类即满足此条件。
31.python的import的处理顺序为,首先查询sys.modules是否已经包含请求的模块,如果没有则从sys.meta_path列表中逐个查询(sys.meta_path中每个是一个钩子类)。有了对这个机制的理解后,我们可以将我们构建的钩子类插入到sys.meta_path的第一个位置,来提升其优先级。这样就达到了一旦有远端包体服务器可以覆盖到的包体,即被此钩子拦截并请求其包体。
32.客户端向服务器端发送鉴权请求,本方案将鉴权请求放在钩子类的初始化函数init中。鉴权的方式为常规的http鉴权,即客户端将用户的token发送给服务器端,服务器端返回会话是否为合法且未过期。如果鉴权或者网络失败,则触发异常,给予用户明确提示,并且设置对应的钩子类的状态,以便在find_module被执行时返回none而不是触发异常,这样可以确保本钩子类之后的钩子类被正常按序执行。如果鉴权成功,则将包体服务器的索引下载并存储到内存变量,以便在执行find_module方法时可以快速的从内存中检索。
33.服务器端通过并返回鉴权结果后,客户端向服务器端发送包体请求,包体请求包括本地模块查找的判断及下载请求。包体请求发生在实际的import执行阶段,在python的import执行时,本方案定义的钩子类中的find_module方法被触发。在方法的内部,核心的逻辑为判断本地是否可找到此模块,此步骤完全在客户端执行。在python2中可以通过imp.find_module来判断,在python3中可以通过importlib.util.find_spec和importlib.find_loader的连用来判断,只要有一个找到即表示在本地可以找到此模块。如果本地找不到,则利用在鉴权后通过服务器获取到的模块列表来查询判定。按照python import系统的协议,如果可以查询到,则返回当前钩子类对象自身,会继续触发load_module。如果找不到,则返回none,python会继续询问下一个钩子类。
34.下载请求在客户端钩子类的load_module方法中被触发,由服务器端接收。在实际的钩子中,需要首先判断模块是否已经被导入过,判断方法为,检查请求的模块路径是否存在于sys.modules里。如果已经存在,则返回其键对应的值;如果不存在再向服务器端发起请求。
35.服务器端接收并查找客户端包体请求的包体,并通过客户端的公钥对其进行rsa加密处理。当服务器端接收到客户端的包体下载请求后,会从包的仓库中检索其实际存储位置。为了优化传输速度,在实际情境中这里一般会将其是使用zip打包或者提前预打包。在返回前,使用客户端提供的公钥进行rsa加密,并将加密后的字节密文返回到客户端。
36.解密包括接收服务器端返回的密文,通过秘钥对其解密并导入,即客户端接收到服务器端返回的密文后,利用私钥对服务器端返回的密文进行解密,此时即在内存中得到了包含模块的包体。进一步将包体使用zip展开后得到了模块源码,即可按照常规方式执行导入模块。
37.服务器端代码仓库如果人工维护会极其繁琐,难以商业化,本方案将其放入容器并自动更新。首先需要选择一个可以被容器访问的代码托管平台,本方案以gitlab为平台,选择其他拥有提到的类似功能的平台也可以。gitlab有deploy token的功能,其概念为有deploy token后即可直接拉取仓库代码而不需要拥有其账户,常用于自动部署。我们让发
包方将其代码放于gitlab并提供deploy token,将其配置在容器环境中。当容器的镜像在实例化时,执行git pull操作,鉴于我们已经有deploy token,可以直接拉取到容器内。gitlab还有webhooks的功能,其概念为当代码仓库产生一定的事件时,可以向预先定义好的webhooks发送标准的数据。本方案利用此特性,在发包方更新代码时会产生push events,将其指向服务器端的指定url,服务器端在接收到此请求时就会重新触发git pull。
38.本方案的实现步骤为,先对python的import系统加以利用,在python import时在客户端发送鉴权请求到鉴权服务器,如果当前为合法用户,则继续检查请求的python包体是否在包体服务器内可找到。如果能找到,则在服务器端对包体进行rsa加密处理(加密方式需要和客户端保持一致)。即服务器端使用预算存储的客户端公钥进行加密,将加密后的字节数据返回,在此返回header中。客户端接收到密文后,使用私钥进行解密。如果解密失败,则可能为用户鉴权正确但私钥不正确用户(用户密码泄露可能会出现这种情况)。如果解密成功,则将解密后的包体接入python import系统,执行代码。
39.本方案可以使用本地缓存,来避免不必要的远程访问;还可以使用预打包、预加密的方式,将计算前置,来提升访问速度。本方案提供了一种适合实际的远程调用python的方式,并且在此基础上实现了调用过程的代码保护、实时鉴权、本地缓存的功能;采用cs架构,将上述功能集成到了一个普通python模块中作为客户端,并使用cython对此客户端模块自身进行保护。
40.以上所述仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专利的技术人员在不脱离本发明技术方案范围内,当可利用上述提示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明方案的范围内。
技术特征:
1.一种python远程加密执行方案,其特征在于,包括:客户端构建钩子类对用户导入模块请求进行判断,所述构子类具备find_module方法和load_module方法,且在导入处理顺序的优先级最高;客户端向服务器端发送鉴权请求,所述鉴权请求经服务器端判断并返回鉴权结果会话;客户端在所述鉴权请求通过后向服务器端发送包体请求;服务器端从包的仓库中检索包体的存储位置,对包体进行加密处理并向客户端返回密文;客户端利用私钥对密文进行解密,将解密后的包体解压缩后接入python import系统并执行代码。2.根据权利要求1所述的一种python远程加密执行方案,其特征在于:所述鉴权的方式为http鉴权,即服务器端接受用户的token并返回会话,所述会话包括是否合法和过期。3.根据权利要求1所述的一种python远程加密执行方案,其特征在于:所述包体请求发生在在实际的import执行阶段,包括客户端通过触发find_module方法进行本地模块查找的判断及通过触发load_module方法向服务器端发送下载请求。4.根据权利要求1所述的一种python远程加密执行方案,其特征在于:所述加密处理包括利用公钥对打包的包体进行rsa加密,并返回加密后的字节密文。5.根据权利要求1所述的一种python远程加密执行方案,其特征在于:所述解密包括接收服务器端返回的密文,通过秘钥对其解密获得包含模块的包体,将包体解压缩后的模块源码执行导入。6.根据权利要求1所述的一种python远程加密执行方案,其特征在于:所述接入python import系统通过代码托管平台实现服务器端仓库代码的初始化和更新。
技术总结
本发明公开了一种Python远程加密执行方案,包括:向服务器端发送鉴权请求,所述鉴权请求通过后向服务器端发送包体请求;服务器端查找包体请求的包体并对其进行加密处理;客户端利用私钥对密文进行解密,将解密后的包体接入Python import系统并执行代码。本发明把代码远程执行和保护结合到了一起,极大的节省代码更新对代码提供者和使用者带来的时间,且代码更新后使用者下次导入模块即为最新版,无需多余的操作。另外由于动态的鉴权机制,可以随时控制每用户的对工具的可用性,在实际实现时和其他管理项(比如项目有效性)关联在一起,能达到更好的控制体验。鉴于本发明把所有的客户端实现都封装到了一个模块,对原有代码的入侵程度很小。度很小。度很小。
技术研发人员:董陆阳 龚斌 王铁兵 吕高攀
受保护的技术使用者:数字视觉云(北京)科技发展有限公司
技术研发日:2023.04.10
技术公布日:2023/8/5
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/