分享好友 站长动态首页 网站导航

python算法加密—pyarmor&docker

2022-07-02 13:15 · 头闻号编程技术

文章目录

为了避免代码泄露的风险,我们往往需要对代码进行加密PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后Python源代码的有效期限,绑 定加密后的Python源代码到硬盘、网卡等硬件设备。

一 基础配置

pip install pyarmor

pip install --upgrade pyarmor

二 基本语法

2.1 加密 Python 脚本

a) 单个包,只有单级目录
使用命令obfuscate来加密 python 脚本。在最简单的情况下,最常用的一种情况是切换到主函数脚本algorithm.py所在的路径,然后执行:

pyarmor obfuscate algorithm.py
在这里插入图片描述

PyArmor 会加密 algorithm.py 和相同目录下面的所有 *.py 文件:

b) 若有多个算法包、多级目录
默认情况下,只有和主脚本相同目录的其他 *.py 会被同时加密。如果想递归加密 子目录下的所有 *.py 文件,使用下面的命令:

pyarmor obfuscate --recursive algorithm.py

🙇注意:只能加密.py文件,如果算法需要调用.csv.json文件,直接拷贝到dist文件夹对应的包里就可以了
在这里插入图片描述

2.2 运行加密脚本

运行加密脚本不需要安装pyarmo

cd dist
python algorithm.py

2.3 发布加密脚本

执行到这一步已经可以发布加密脚本了,发布加密脚本只需要把输出路径的所有dist文件拷贝即可。

三、pyarmor&docker

由于pyarmo加密的脚本对运行环境比较敏感,因此我们最好把整个算法打包成镜像,在启动容器的时候进行加密,并删除所有的未加密文件,留下dist文件

:上文也说过,pyarmo只能对.py文件加密,对于.csv.json文件是无法加密的,自然在生成的dist包里也没有非.py后缀的文件,因此我们需要将.csv等文件移入到dist,不然运行dist里的算法时会报错。

下面将以myprocessor的算法包为例,讲述整个流程
在这里插入图片描述

可以看出,里面是多个算法包互相调用的,且有较多的非.py文件

3.1 Dockerfile

FROM python:3.6 # 导入python3.6基础环境RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  && echo 'Asia/Shanghai'>/etc/timezone # 同步系统时间COPY ./ ./app/ # 将算法里面的所有文件和文件夹复制到镜像里WORKDIR /app/ # 设置镜像里的app为主文件夹RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 将算法需要的包在镜像中进行安装RUN pyarmor obfuscate --recursive myprocessor.py # 对所有算法递归加密RUN ls # 显示app内的所有文件CMD ["python3","/app/dist/myprocessor.py"] # 运行dist内的加密后的主函数

3.2 requirements.txt

# 这里就是运行我的算法依赖的模块,pyarmor==7.4.2一定要加,其他的根据自己的算法依赖添加pyarmor==7.4.2pandas == 1.1.5numpy == 1.19.5requests == 2.25.1

3.3 加密函数lock_by_pyarmor.py

# -*- coding: utf-8 -*- # @Time : 2022/4/20 10:10 # @Author : Orange# @File : lock_by_pyarmor.pyimport shutilimport osclass File_lock():    def __init__(self):        self.root_path = os.getcwd()  # 当前工作路径    def remove_and_del_unsecret_dir_f(self):        '''移除未加密的py和pyc文件,复制非py,pyc文件到dist'''        for root, dir, files in os.walk(self.root_path):            if "dist" not in root:                for file in files:                    if os.path.splitext(file)[-1] in ['.py', '.pyc']:                        # 删除所有未加密的.py和.pyc文件                        os.remove(os.path.join(root, file))                    else:                        # 由于非py文件无法加密,因此将非py文件移动到同名文件夹下,若找不到同名文件夹就创建同名文件夹                        if root == self.root_path:                            dist_same_die_path = os.path.join(self.root_path, 'dist')                        else:                            dist_same_die_path = os.path.join(self.root_path, 'dist', os.path.basename(root))                        if not os.path.exists(dist_same_die_path):                            os.mkdir(dist_same_die_path)                        shutil.move(os.path.join(root, file), dist_same_die_path)        temp_list = os.listdir() # 移除dist外的所有空文件夹        temp_list.remove('dist')        for i in temp_list:            os.rmdir(i)    def lock_by_pyarmor(self):        # print("当前工作路径:",self.root_path)        # print("os.listdir", os.listdir())        if (not os.path.exists(os.path.join(self.root_path, "dist"))):  # 若dist不存在            os.system("pyarmor obfuscate --recursive myprocessor.py")  # 加密            self.remove_and_del_unsecret_dir_f()        else:            # print("加密后文件夹",os.listdir())            self.remove_and_del_unsecret_dir_f()            # print("移除未加密文件后",os.listdir())

3.4 主函数myprocessor.py

from lock_by_pyarmor import File_lockdef call(arg, model, *args, **kwargs):    lockf = File_lock()    lockf.lock_by_pyarmor()    from deviation_algothrim.get_deviation import Deviation    from loss_power.get_loss_power import GetPower    passif __name__ == "__main__":    print(call(arg=None, model=None))

👴:注意从其他包里导入需要的内容,需要放到lockf.lock_by_pyarmor()之后,不然,还没有完全构建成dist文件,可能会调用报错。

3.5 创建镜像并验证效果

📢 ps: 如有问题,或者lock_by_pyarmor.py有更好的实现方法,希望可以指正🙆。

免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报

举报
反对 0
打赏 0
更多相关文章

评论

0

收藏

点赞