python算法加密 pyarmor與docker
前言
為了避免代碼泄露的風(fēng)險,我們往往需要對代碼進(jìn)行加密,PyArmor 是一個用于加密和保護(hù) Python 腳本的工具。它能夠在運行時刻保護(hù) Python腳本的二進(jìn)制代碼不被泄露,設(shè)置加密后Python源代碼的有效期限,綁 定加密后的Python源代碼到硬盤、網(wǎng)卡等硬件設(shè)備。
一 基礎(chǔ)配置 安裝
pip install pyarmor
更新到最新版本:
pip install --upgrade pyarmor
二 基本語法 2.1 加密 Python 腳本
a) 單個包,只有單級目錄
使用命令obfuscate來加密 python 腳本。在最簡單的情況下,最常用的一種情況是切換到主函數(shù)腳本algorithm.py所在的路徑,然后執(zhí)行:
pyarmor obfuscate algorithm.py

PyArmor 會加密 algorithm.py 和相同目錄下面的所有 *.py 文件:
- 創(chuàng)建輸出子目錄
dist - 生成加密的主腳本
algorithm.py保存在輸出目錄dist - 加密相同目錄下其他所有
*.py文件,保存到輸出目錄dist - 生成運行加密腳本所需要的全部輔助文件,保存到輸出目錄
dist

b) 若有多個算法包、多級目錄
默認(rèn)情況下,只有和主腳本相同目錄的其他 *.py 會被同時加密。如果想遞歸加密 子目錄下的所有 *.py 文件,使用下面的命令:
pyarmor obfuscate --recursive algorithm.py
注意:只能加密.py文件,如果算法需要調(diào)用.csv,.json文件,直接拷貝到dist文件夾對應(yīng)的包里就可以了

2.2 運行加密腳本
運行加密腳本不需要安裝pyarmo
cd dist
python algorithm.py
2.3 發(fā)布加密腳本
執(zhí)行到這一步已經(jīng)可以發(fā)布加密腳本了,發(fā)布加密腳本只需要把輸出路徑的所有dist文件拷貝即可。
三、pyarmor&docker
由于pyarmo加密的腳本對運行環(huán)境比較敏感,因此我們最好把整個算法打包成鏡像,在啟動容器的時候進(jìn)行加密,并刪除所有的未加密文件,留下dist文件
注:上文也說過,pyarmo只能對
.py文件加密,對于.csv,.json文件是無法加密的,自然在生成的dist包里也沒有非.py后綴的文件,因此我們需要將.csv等文件移入到dist里,不然運行dist里的算法時會報錯。
由于我本地是windows系統(tǒng),所以生成.dll后綴文件,直接把dist制作成鏡像會報錯,因為容器運行需要.so文件,因此考慮在容器中運行時加密,生成.so,再自動移除未加密文鍵,只留下dist及所需的非.py后綴文件,其實也可以用linux系統(tǒng)直接本地運行生成dist,但是不要忘記將非.py后綴的文件及文件夾復(fù)制進(jìn)去。
下面將以myprocessor的算法包為例,講述整個流程:

可以看出,里面是多個算法包互相調(diào)用的,且有較多的非
.py文件
3.1 Dockerfile
FROM python:3.6 # 導(dǎo)入python3.6基礎(chǔ)環(huán)境 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\ && echo 'Asia/Shanghai'>/etc/timezone # 同步系統(tǒng)時間 COPY ./ ./app/ # 將算法里面的所有文件和文件夾復(fù)制到鏡像里 WORKDIR /app/ # 設(shè)置鏡像里的app為主文件夾 RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 將算法需要的包在鏡像中進(jìn)行安裝 RUN pyarmor obfuscate --recursive myprocessor.py # 對所有算法遞歸加密 RUN ls # 顯示app內(nèi)的所有文件 CMD ["python3","/app/dist/myprocessor.py"] # 運行dist內(nèi)的加密后的主函數(shù)
3.2 requirements.txt
# 這里就是運行我的算法依賴的模塊,pyarmor==7.4.2一定要加,其他的根據(jù)自己的算法依賴添加 pyarmor==7.4.2 pandas == 1.1.5 numpy == 1.19.5 requests == 2.25.1
3.3 加密函數(shù)lock_by_pyarmor.py
# -*- coding: utf-8 -*-
import shutil
import os
class File_lock():
def __init__(self):
self.root_path = os.getcwd() # 當(dāng)前工作路徑
def remove_and_del_unsecret_dir_f(self):
'''移除未加密的py和pyc文件,復(fù)制非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文件移動到同名文件夾下,若找不到同名文件夾就創(chuàng)建同名文件夾
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("當(dāng)前工作路徑:",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 主函數(shù)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))注意:從其他包里導(dǎo)入需要的內(nèi)容,需要放到
lockf.lock_by_pyarmor()之后,不然,還沒有完全構(gòu)建成dist文件,可能會調(diào)用報錯。
3.5 創(chuàng)建鏡像并驗證效果
docker build _t imag1 .建立完鏡像后,app內(nèi)目錄為:

- docker run -d imag1 /bin/bash -c "tail -f /dev/null"
- docker ps #找到正在運行的容器id
- docker exec -it 2293ee92f3ca /bin/bash # 進(jìn)入容器
- python /app/dist/myprocessor.py # 執(zhí)行加密文件


可以看到app內(nèi)只剩下了dist文件。
最后需要將啟動的容器重新打包成鏡像,并發(fā)布到harbor上:docker commit 2293ee92f3ca7 new_image,丟棄原本的鏡像。因為原本鏡像中是有未加密文件的,并且可以訪問 。
可以將容器里的加密文件導(dǎo)出到本地D盤: docker cp bf5f2e815b64:/app D:/
ps: 如有問題,或者lock_by_pyarmor.py有更好的實現(xiàn)方法,希望可以指正。
到此這篇關(guān)于python算法加密 pyarmor與docker的文章就介紹到這了,更多相關(guān)python 算法加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python監(jiān)控網(wǎng)卡流量并使用graphite繪圖的示例
這篇文章主要介紹了python監(jiān)控網(wǎng)卡流量并使用graphite繪圖的示例,需要的朋友可以參考下2014-04-04
使用Python paramiko模塊利用多線程實現(xiàn)ssh并發(fā)執(zhí)行操作
ssh是一個協(xié)議,OpenSSH是其中一個開源實現(xiàn),paramiko是Python的一個庫,實現(xiàn)了SSHv2協(xié)議(底層使用cryptography)。這篇文章主要介紹了使用Python paramiko模塊利用多線程實現(xiàn)ssh并發(fā)執(zhí)行操作,需要的朋友可以參考下2019-12-12

