python算法加密 pyarmor与docker

目录
  • 前言
  • 一 基础配置 安装
  • 二 基本语法 2.1 加密 Python 脚本
    • 2.2 运行加密脚本
    • 2.3 发布加密脚本
  • 三、pyarmor&docker
    • 3.1 Dockerfile
    • 3.2 requirements.txt
    • 3.3 加密函数lock_by_pyarmor.py
    • 3.4 主函数myprocessor.py
    • 3.5 创建镜像并验证效果

前言

为了避免代码泄露的风险,我们往往需要对代码进行加密,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 文件:

  • 创建输出子目录 dist
  • 生成加密的主脚本 algorithm.py 保存在输出目录 dist
  • 加密相同目录下其他所有 *.py 文件,保存到输出目录 dist
  • 生成运行加密脚本所需要的全部辅助文件,保存到输出目录 dist

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里的算法时会报错。

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

下面将以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.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内目录为:

  • 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 # 执行加密文件

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

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

到此这篇关于python算法加密 pyarmor与docker的文章就介绍到这了,更多相关python 算法加密内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 盘点Python加密解密模块hashlib的7种加密算法(推荐)

    前言 在程序中我们经常可以看到有很多的加密算法,比如说MD5 sha1等,今天我们就来了解下这下加密算法的吧,在了解之前我们需要知道一个模块嘛就是hashlib,他就是目前Python一个提供字符加密的模块,它加密的字符类型为二进制编码,所以直接加密字符串会报错. import hashlib string='任性的90后boy' #使用encode进行转换 sha1 = hashlib.sha1() sha1.update(string.encode('utf-8')) res = sha1.

  • 利用python设计图像加密技术(Arnold算法)

    目录 1.加密算法要求 2.Arnold置乱原理 3.python实现 4.结果分析与总结 下面展示了图像的加密和解密过程(左边是输入图像,中间是加密后的结果,右边是解密后的图像): 1.加密算法要求 (1)加密算法必须是可逆的,拥有配套的解密算法 (2)必须是安全的,拦截者不能轻易的破解加密方式 (3)不能造成数据量剧增,比如一个1kb的图像加密后变为100kb 2.Arnold置乱原理 Arnold置乱又称为猫脸置乱,据说是因为Arnold首先对猫脸图像应用了这个算法.置乱的含义是置换和打乱

  • Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    生活中我们经常会遇到一些加密算法,今天我们就聊聊这些加密算法的Python实现.部分常用的加密方法基本都有对应的Python库,基本不再需要我们用代码实现具体算法. MD5加密 全称:MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致.md5加密算法是不可逆的,所以解密一般都是通过暴力穷举方法,通过网站的接口实现解密.Python代码: i

  • Python 实现国产SM3加密算法的示例代码

    SM3是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布.主要用于报告文件数字签名及验证. Python3代码如下: from math import ceil ############################################################################## # # 国产SM3加密算法 # #####################################################

  • python3 常见解密加密算法实例分析【base64、MD5等】

    本文实例讲述了python3 常见解密加密算法.分享给大家供大家参考,具体如下: 一.使用base64 Base64编码,64指A-Z.a-z.0-9.+和/这64个字符,还有"="号不属于编码字符,而是填充字符. 优点:方法简单 缺点:不保险,别人拿到密文可以自己解密出明文 编码原理:将3个字节转换成4个字节((3 X 8)=24=(4X6)),先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了. 解码原理:将4个字节转换成3个字节,先读入4个6位(用或

  • python实现可逆简单的加密算法

    最近想把word密码文件的服务器密码信息归档到mysql数据库,心想着如果直接在里面写明文密码会不会不安全,如果用sha这些不可逆的算法又没法还原回来,所以自己就想着用Python写一个小代码,先把明文密码加密之后再存mysql表中.下面贴出我的Python代码: 首先是加密encript.py # coding:utf-8 def encrpt(s): length = len(s) j = "" for i in s: if ord(i) <= 49: i = chr(ord

  • python3中rsa加密算法详情

    前言: rsa加密,是一种加密算法,目前而言,加密算法,是对数据.密码等进行加密.第一次接触rsa加密算法是linux中免密登陆设置,当时一直以为密钥加密是像token一样的,直到现在才发现并不是,而是一种数据加密的方式,其实也可以理解,在Linux设计哲学的理解下:“一切皆文件”,就可以把他们当成类似的东西来理解.无非就是拿着a字符串和b字符串进行比较,如果返回trun,那么就可以进行下一步的操作,否则就会被返回异常. 在这里,其实有一个逻辑,就是先把数据进行一次加密,然后进行数据传输,在接收

  • Python实现ElGamal加密算法的示例代码

    在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法.它在1985年由塔希尔·盖莫尔提出.GnuPG和PGP等很多密码学系统中都应用到了ElGamal算法. ElGamal加密算法可以定义在任何循环群G上.它的安全性取决于G上的离散对数难题. 使用Python实现ElGamal加密算法,完成加密解密过程,明文使用的是125位数字(1000比特). 代码如下: import random from math import pow a = random.randint(2

  • python 中的pycrypto 算法加密

    目录 一.安装 二.AES 加密解密 三.SHA加密 四.RSA算法生成密钥对 五.使用密钥对加密解密 六.加签和验签 一.安装 pycryto能实现大致3种类型的数据加密(单向加密.对称加密 和非对称加密),产生随机数,生成密钥对,数字签名 单向加密:Crypto.Hash,其中中包含MD5.SHA1.SHA256等 对称加密:Crypto.Cipher,如常见的DES等 非对称加密:Crypto.Cipher,如常见的AES加密等 随机数操作:Crypto.Random,也可以使用Pytho

  • DES加密解密算法之python实现版(图文并茂)

    一.DSE算法背景介绍 1. DES的采用 1979年,美国银行协会批准使用 1980年,美国国家标准局(ANSI)赞同DES作为私人使用的标准,称之为DEA(ANSI X.392) 1983年,国际化标准组织ISO赞同DES作为国际标准,称之为DEA-1 该标准规定每五年审查一次,计划十年后采用新标准 最近的一次评估是在1994年1月,已决定1998年12月以后,DES将不再作为联邦加密标准. 2.DES算法特点 1) 分组加密算法: 以64位为分组.64位一组的明文从算法一端输入,64位密文

随机推荐