Python實現(xiàn)代碼加密的兩種方案詳解
方案1:使用Pyarmor工具進行加密
PyArmor 是一個用于加密和保護 Python 腳本的工具。它能夠在運行時刻保護 Python腳本的二進制代碼不被泄露,設置加密后 Python 源代碼的有效期限,綁定加密后的Python源代碼到硬盤、網(wǎng)卡等硬件設備。
1、安裝
pip install pyarmor # 驗證是否安裝成功, 7.0 以下版本為穩(wěn)定版 pyarmor --version
2、加密過程
首先把源代碼編譯成代碼塊
char *filename = "foo.py"; char *source = read_file( filename ); PyCodeObject *co = Py_CompileString( source, "<frozen foo>", Py_file_input );
接著進行如下處理
使用 try…finally 語句把代碼塊的代碼段 co_code 包裹起來
新添加一個頭部,對應于 try 語句:
LOAD_GLOBALS N (__armor_enter__) N = length of co_consts
CALL_FUNCTION 0
POP_TOP
SETUP_FINALLY X (jump to wrap footer) X = size of original byte code接著是處理過的原始代碼段:
對于所有的絕對跳轉指令,操作數(shù)增加頭部字節(jié)數(shù)
加密修改過的所有指令代碼
追加一個尾部,對應于 finally 塊:
LOAD_GLOBALS N + 1 (__armor_exit__)
CALL_FUNCTION 0
POP_TOP
END_FINALLY添加字符串名稱 __armor_enter, __armor_exit__ 到 co_consts
如果 co_stacksize 小于 4,那么設置為 4
在 co_flags 設置自定義的標志位 CO_OBFUSCAED (0x80000000)
按照上面的方式遞歸修改 co_consts 中的所有類型為代碼塊的常量
然后把改裝后的代碼塊轉換成為字符串,把字符串進行加密,保護其中的常量和字符串
char *string_code = marshal.dumps( co ); char *obfuscated_code = obfuscate_algorithm( string_code );
最后生成加密后的腳本,寫入到磁盤文件
sprintf( buf, "__pyarmor__(__name__, __file__, b'%s')", obfuscated_code ); save_file( "dist/foo.py", buf );
3、加密模式
PyArmor 提供多種加密模式,以滿足安全和性能方面的平衡。通常情況下,默認 的加密模式能夠滿足絕大多數(shù)的需要,一般情況下也不需要對加密模式有詳細 的了解。僅當對性能有特別的要求或者默認加密模式無法滿足需求的時候,才需 要改變加密模式,這就需要理解 PyArmor 的不同加密模式。
默認加密模式
加密腳本命令
pyarmor obfuscate xx.py
超級模式
目前支持版本
- python 2.7
- python 3.7
加密腳本命令
pyarmor obfuscate --advanced 2 xx.py
高級模式
加密腳本命令
pyarmor obfuscate --advanced 1 xx.py
其他加密模式(不常用)
- 代碼加密模式
- 代碼包裹模式
- 模塊加密模式
- 約束模式
4、使用pyarmor
1.加密腳本
pyarmor [command] [options]
常用命令:pyarmor obfuscate main.py
pyarmor會加密main.py文件和相同目錄下的所有*.py文件,并創(chuàng)建輸出子目錄dist, 生成加密的主腳本main,py、相同目錄下的**.py、生成的運行加密腳本所需的全部輔助文件保存到dis輸出目錄
2.發(fā)布加密腳本
發(fā)布加密腳本給客戶只需要把輸出路徑dist的所有文件拷貝過去即可
3.生成新的許可文件(可選)
使用命令 licenses為加密腳本生成新的許可文件license.lic,加密腳本的同時會在輸出目錄下面生成一個默認許可文件,dist/licnese.lic,需要生成新的許可文件,并覆蓋默認許可文件
例如:
pyarmor licneses --expired 2019 -01-01 code-001
執(zhí)行該命令會生成一個帶有效期的認證文件,這樣超過指定日期后加密腳本就無法正常運行了
4.綁定加密腳本到固定機器上(可選)
如果想綁定加密腳本到固定機器上,首先在該機器上面運行下面的命令獲取硬件信息
pyarmor hdinfo
然后生成綁定到固定機器的許可文件
pyarmor licenses --bind-disk “100304PBN2081SF3NJ5T” --bind-mac “20:c1:d2:2f:a0:96” code-002,
同樣,覆蓋默認的許可證,這樣加密腳本就只能在指定機器上運行
5、優(yōu)缺點
優(yōu)點
- 使用方便,加密腳本較快且能一鍵加密,操作較簡單
- 多種加密模式,滿足常規(guī)絕大多數(shù)的加密要求
- 有文檔支持,對于常見的錯誤異??梢酝ㄟ^查閱官方文檔解決
- 支持其他功能,例如,檢查加密腳本的性能、交叉保護機制
- 可以設置加密文件有效期及綁定在固定機器上
缺點
- 每個大的版本的改動比較大,安裝時需要查看官方文檔選用合適的版本進行安裝
- 個別版本交叉發(fā)布時腳本無法運行,具體查看官方文檔
- 安裝python版本時需要開啟靜態(tài)庫的共享進行安裝,否則會無法加密文件
- 運行加密文件時的python版需要和加密時的python版本一致
- pyarmor安裝的默認是試用版,對加密文件的大小、模塊的函數(shù)個數(shù)等都有限制,用于商業(yè)時需要單獨購買
方案2:使用cython進行加密
1、安裝
pip install cython
2、加密過程
- 利用Cython將.py文件編譯為.c文件
- 將.c文件編譯為為.so或.pyd文件,linux系統(tǒng)為.so文件,Windows系統(tǒng)為.pyd文件
3、使用Cython
創(chuàng)建setup.py加密指定的python文件
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize(["main.py"], language_level=3)
4、簡化Cython加密過程
jmpy3為python的一個第三方庫,能夠將python代碼一鍵加密為.so或者.pyd文件,支持單個文件加密,整個項目加密,加密后會在項目目錄中增加一個dist的文件夾,把源文件替換為加密后的文件即可正常運行
安裝
pip install jmpy3
切換到項目所在目錄,執(zhí)行以下命令
jmpy -i 項目名稱
發(fā)布加密腳本
同樣加密后會在項目目錄中增加一個dist的文件夾,把源文件替換為加密后的文件即可正常運行
5、優(yōu)缺點
優(yōu)點
- 通過jmpy3可以實現(xiàn)一鍵加密,加密較為方便
- 加密后代碼運行效率有所提升
- 生成.so或.pyd文件難以破解
缺點
- 兼容性稍差,對于不同的版本的操作系統(tǒng),需要重新編譯
- 運行加密文件時的python版需要和加密時的python版本一致
- 沒有官方文檔,使用加密后的代碼出錯后,需要自己排查解決錯誤
到此這篇關于Python實現(xiàn)代碼加密的兩種方案詳解的文章就介紹到這了,更多相關Python代碼加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用SQLAlchemy模塊實現(xiàn)操作數(shù)據(jù)庫
SQLAlchemy 是用Python編程語言開發(fā)的一個開源項目,它提供了SQL工具包和ORM對象關系映射工具,使用SQLAlchemy可以實現(xiàn)高效和高性能的數(shù)據(jù)庫訪問,下面我們就來學習一下SQLAlchemy模塊的具體應用吧2023-11-11
Python控制windows系統(tǒng)音量實現(xiàn)實例
這篇文章主要介紹了Python控制windows系統(tǒng)音量實現(xiàn)實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01
Python?selenium安裝+Microsoft?Edge驅動器下載配置流程(最新推薦)
本文介紹了如何在Python自動化Web瀏覽器背景下配置MicrosoftEdge瀏覽器驅動,主要內(nèi)容包括查看瀏覽器版本、下載對應驅動、配置環(huán)境以及安裝和驗證Selenium庫,感興趣的朋友一起看看吧2025-02-02

