python算法加密 pyarmor与docker

作者:hellobigorange 时间:2023-02-15 02:17:32 

前言

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

一 基础配置 安装

pip install pyarmor

更新到最新版本:

pip install --upgrade pyarmor

二 基本语法 2.1 加密 Python 脚本

a) 单个包,只有单级目录

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

pyarmor obfuscate algorithm.py

python算法加密 pyarmor与docker

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

  • 创建输出子目录 dist

  • 生成加密的主脚本 algorithm.py 保存在输出目录 dist

  • 加密相同目录下其他所有 *.py 文件,保存到输出目录 dist

  • 生成运行加密脚本所需要的全部辅助文件,保存到输出目录 dist

python算法加密 pyarmor与docker

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

pyarmor obfuscate --recursive algorithm.py

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

python算法加密 pyarmor与docker

2.2 运行加密脚本

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

cd dist
python algorithm.py

2.3 发布加密脚本

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

三、pyarmor&docker

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

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

由于我本地是windows系统,所以生成.dll后缀文件,直接把dist制作成镜像会报错,因为容器运行需要.so文件,因此考虑在容器中运行时加密,生成.so,再自动移除未加密文键,只留下dist及所需的非.py后缀文件,其实也可以用linux系统直接本地运行生成dist,但是不要忘记将非.py后缀的文件及文件夹复制进去。

下面将以myprocessor的算法包为例,讲述整个流程:

python算法加密 pyarmor与docker

可以看出,里面是多个算法包互相调用的,且有较多的非.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.2
pandas == 1.1.5
numpy == 1.19.5
requests == 2.25.1

3.3 加密函数lock_by_pyarmor.py

# -*- coding: utf-8 -*-
import shutil
import os
class 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_lock
def 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
   pass
if __name__ == "__main__":

print(call(arg=None, model=None))

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

3.5 创建镜像并验证效果

docker build _t imag1 .建立完镜像后,app内目录为:

python算法加密 pyarmor与docker

  • docker run -d imag1 /bin/bash -c "tail -f /dev/null"

  • docker ps #找到正在运行的容器id

  • docker exec -it 2293ee92f3ca /bin/bash # 进入容器

  • python /app/dist/myprocessor.py # 执行加密文件

python算法加密 pyarmor与docker

python算法加密 pyarmor与docker

可以看到app内只剩下了dist文件。
最后需要将启动的容器重新打包成镜像,并发布到harbor上:docker commit 2293ee92f3ca7 new_image,丢弃原本的镜像。因为原本镜像中是有未加密文件的,并且可以访问 。
可以将容器里的加密文件导出到本地D盘: docker cp bf5f2e815b64:/app D:/

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

来源:https://blog.csdn.net/qq_34229228/article/details/125102087

标签:python,算法,加密,pyarmor,docker
0
投稿

猜你喜欢

  • 浅谈Python traceback的优雅处理

    2023-08-06 06:57:42
  • PHP行为设计模式之策略模式

    2023-05-28 08:34:46
  • Python的Web框架Django介绍与安装方法

    2021-03-06 05:46:12
  • MySQL插入emoji表情失败问题的解决方法

    2024-01-24 05:26:05
  • mysql 开发技巧之JOIN 更新和数据查重/去重

    2024-01-17 06:30:54
  • golang gorm框架数据库的连接操作示例

    2024-01-21 06:52:56
  • Python 读取串口数据,动态绘图的示例

    2021-11-15 19:36:24
  • JMail(4.3版本)发信asp代码

    2007-08-03 12:40:00
  • CentOS中安装python3.8.2的详细教程

    2022-05-08 11:55:52
  • logrus日志自定义格式操作

    2024-04-26 17:20:24
  • matlab中乘法“*”和点乘“.*”;除法“/”和点除“./”的联系和区别

    2022-03-08 19:52:44
  • 简单介绍python封装的基本知识

    2022-04-16 18:51:11
  • AJAX的jQuery实现入门(一)

    2008-05-01 12:55:00
  • 在pycharm中debug 实时查看数据操作(交互式)

    2023-01-19 08:31:11
  • 如何让python程序正确高效地并发

    2021-10-14 20:33:54
  • 以SortedList为例详解Python的defaultdict对象使用自定义类型的方法

    2022-04-07 02:32:28
  • ASP 常见的连接字符串写法(access2007)

    2011-03-25 10:40:00
  • 关于ASP循环表格的问题之解答[比较详细]

    2011-04-08 11:14:00
  • OpenCV哈里斯(Harris)角点检测的实现

    2022-10-07 01:41:26
  • Python读取YAML文件过程详解

    2021-04-21 07:12:25
  • asp之家 网络编程 m.aspxhome.com