前言
一 基礎配置 安裝
二 基本語法 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
更新到最新版本:
二 基本語法 2.1 加密 Python 腳本pip install --upgrade pyarmor
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
文件夾對應的包裡就可以了
運行加密腳本不需要安裝pyarmo
2.3 發布加密腳本cd dist
python algorithm.py
執行到這一步已經可以發布加密腳本了,發布加密腳本只需要把輸出路徑的所有dist
文件拷貝即可。
由於pyarmo
加密的腳本對運行環境比較敏感,因此我們最好把整個算法打包成鏡像,在啟動容器的時候進行加密,並刪除所有的未加密文件,留下dist
文件
注:上文也說過,pyarmo只能對
.py
文件加密,對於.csv
,.json
文件是無法加密的,自然在生成的dist
包裡也沒有非.py
後綴的文件,因此我們需要將.csv
等文件移入到dist
裡,不然運行dist
裡的算法時會報錯。
由於我本地是windows
系統,所以生成.dll
後綴文件,直接把dist制作成鏡像會報錯,因為容器運行需要.so
文件,因此考慮在容器中運行時加密,生成.so
,再自動移除未加密文鍵,只留下dist
及所需的非.py
後綴文件,其實也可以用linux
系統直接本地運行生成dist
,但是不要忘記將非.py
後綴的文件及文件夾復制進去。
下面將以myprocessor
的算法包為例,講述整個流程:
3.1 Dockerfile可以看出,裡面是多個算法包互相調用的,且有較多的非
.py
文件
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 -*- import 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.pyfrom 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))
3.5 創建鏡像並驗證效果注意:從其他包裡導入需要的內容,需要放到
lockf.lock_by_pyarmor()
之後,不然,還沒有完全構建成dist文件,可能會調用報錯。
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 算法加密內容請搜索軟件開發網以前的文章或繼續浏覽下面的相關文章希望大家以後多多支持軟件開發網!