Python實(shí)現(xiàn)代碼加密的兩種方案詳解
方案1:使用Pyarmor工具進(jìn)行加密
PyArmor 是一個(gè)用于加密和保護(hù) Python 腳本的工具。它能夠在運(yùn)行時(shí)刻保護(hù) Python腳本的二進(jìn)制代碼不被泄露,設(shè)置加密后 Python 源代碼的有效期限,綁定加密后的Python源代碼到硬盤、網(wǎng)卡等硬件設(shè)備。
1、安裝
pip install pyarmor # 驗(yàn)證是否安裝成功, 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 );
接著進(jìn)行如下處理
使用 try…finally 語句把代碼塊的代碼段 co_code 包裹起來
新添加一個(gè)頭部,對(duì)應(yīng)于 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接著是處理過的原始代碼段:
對(duì)于所有的絕對(duì)跳轉(zhuǎn)指令,操作數(shù)增加頭部字節(jié)數(shù)
加密修改過的所有指令代碼
追加一個(gè)尾部,對(duì)應(yīng)于 finally 塊:
LOAD_GLOBALS N + 1 (__armor_exit__)
CALL_FUNCTION 0
POP_TOP
END_FINALLY添加字符串名稱 __armor_enter, __armor_exit__ 到 co_consts
如果 co_stacksize 小于 4,那么設(shè)置為 4
在 co_flags 設(shè)置自定義的標(biāo)志位 CO_OBFUSCAED (0x80000000)
按照上面的方式遞歸修改 co_consts 中的所有類型為代碼塊的常量
然后把改裝后的代碼塊轉(zhuǎn)換成為字符串,把字符串進(jìn)行加密,保護(hù)其中的常量和字符串
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 提供多種加密模式,以滿足安全和性能方面的平衡。通常情況下,默認(rèn) 的加密模式能夠滿足絕大多數(shù)的需要,一般情況下也不需要對(duì)加密模式有詳細(xì) 的了解。僅當(dāng)對(duì)性能有特別的要求或者默認(rèn)加密模式無法滿足需求的時(shí)候,才需 要改變加密模式,這就需要理解 PyArmor 的不同加密模式。
默認(rèn)加密模式
加密腳本命令
pyarmor obfuscate xx.py
超級(jí)模式
目前支持版本
- python 2.7
- python 3.7
加密腳本命令
pyarmor obfuscate --advanced 2 xx.py
高級(jí)模式
加密腳本命令
pyarmor obfuscate --advanced 1 xx.py
其他加密模式(不常用)
- 代碼加密模式
- 代碼包裹模式
- 模塊加密模式
- 約束模式
4、使用pyarmor
1.加密腳本
pyarmor [command] [options]
常用命令:pyarmor obfuscate main.py
pyarmor會(huì)加密main.py文件和相同目錄下的所有*.py文件,并創(chuàng)建輸出子目錄dist, 生成加密的主腳本main,py、相同目錄下的**.py、生成的運(yùn)行加密腳本所需的全部輔助文件保存到dis輸出目錄
2.發(fā)布加密腳本
發(fā)布加密腳本給客戶只需要把輸出路徑dist的所有文件拷貝過去即可
3.生成新的許可文件(可選)
使用命令 licenses為加密腳本生成新的許可文件license.lic,加密腳本的同時(shí)會(huì)在輸出目錄下面生成一個(gè)默認(rèn)許可文件,dist/licnese.lic,需要生成新的許可文件,并覆蓋默認(rèn)許可文件
例如:
pyarmor licneses --expired 2019 -01-01 code-001
執(zhí)行該命令會(huì)生成一個(gè)帶有效期的認(rèn)證文件,這樣超過指定日期后加密腳本就無法正常運(yùn)行了
4.綁定加密腳本到固定機(jī)器上(可選)
如果想綁定加密腳本到固定機(jī)器上,首先在該機(jī)器上面運(yùn)行下面的命令獲取硬件信息
pyarmor hdinfo
然后生成綁定到固定機(jī)器的許可文件
pyarmor licenses --bind-disk “100304PBN2081SF3NJ5T” --bind-mac “20:c1:d2:2f:a0:96” code-002,
同樣,覆蓋默認(rèn)的許可證,這樣加密腳本就只能在指定機(jī)器上運(yùn)行
5、優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 使用方便,加密腳本較快且能一鍵加密,操作較簡(jiǎn)單
- 多種加密模式,滿足常規(guī)絕大多數(shù)的加密要求
- 有文檔支持,對(duì)于常見的錯(cuò)誤異??梢酝ㄟ^查閱官方文檔解決
- 支持其他功能,例如,檢查加密腳本的性能、交叉保護(hù)機(jī)制
- 可以設(shè)置加密文件有效期及綁定在固定機(jī)器上
缺點(diǎn)
- 每個(gè)大的版本的改動(dòng)比較大,安裝時(shí)需要查看官方文檔選用合適的版本進(jìn)行安裝
- 個(gè)別版本交叉發(fā)布時(shí)腳本無法運(yùn)行,具體查看官方文檔
- 安裝python版本時(shí)需要開啟靜態(tài)庫的共享進(jìn)行安裝,否則會(huì)無法加密文件
- 運(yùn)行加密文件時(shí)的python版需要和加密時(shí)的python版本一致
- pyarmor安裝的默認(rèn)是試用版,對(duì)加密文件的大小、模塊的函數(shù)個(gè)數(shù)等都有限制,用于商業(yè)時(shí)需要單獨(dú)購買
方案2:使用cython進(jìn)行加密
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、簡(jiǎn)化Cython加密過程
jmpy3為python的一個(gè)第三方庫,能夠?qū)ython代碼一鍵加密為.so或者.pyd文件,支持單個(gè)文件加密,整個(gè)項(xiàng)目加密,加密后會(huì)在項(xiàng)目目錄中增加一個(gè)dist的文件夾,把源文件替換為加密后的文件即可正常運(yùn)行
安裝
pip install jmpy3
切換到項(xiàng)目所在目錄,執(zhí)行以下命令
jmpy -i 項(xiàng)目名稱
發(fā)布加密腳本
同樣加密后會(huì)在項(xiàng)目目錄中增加一個(gè)dist的文件夾,把源文件替換為加密后的文件即可正常運(yùn)行
5、優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 通過jmpy3可以實(shí)現(xiàn)一鍵加密,加密較為方便
- 加密后代碼運(yùn)行效率有所提升
- 生成.so或.pyd文件難以破解
缺點(diǎn)
- 兼容性稍差,對(duì)于不同的版本的操作系統(tǒng),需要重新編譯
- 運(yùn)行加密文件時(shí)的python版需要和加密時(shí)的python版本一致
- 沒有官方文檔,使用加密后的代碼出錯(cuò)后,需要自己排查解決錯(cuò)誤
到此這篇關(guān)于Python實(shí)現(xiàn)代碼加密的兩種方案詳解的文章就介紹到這了,更多相關(guān)Python代碼加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用SQLAlchemy模塊實(shí)現(xiàn)操作數(shù)據(jù)庫
SQLAlchemy 是用Python編程語言開發(fā)的一個(gè)開源項(xiàng)目,它提供了SQL工具包和ORM對(duì)象關(guān)系映射工具,使用SQLAlchemy可以實(shí)現(xiàn)高效和高性能的數(shù)據(jù)庫訪問,下面我們就來學(xué)習(xí)一下SQLAlchemy模塊的具體應(yīng)用吧2023-11-11
Python進(jìn)階學(xué)習(xí)之特殊方法實(shí)例詳析
一般說來,特殊的方法都被用來模仿某個(gè)行為。下面這篇文章主要給大家介紹了關(guān)于Python進(jìn)階學(xué)習(xí)之特殊方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起看看吧。2017-12-12
Python3.x爬蟲下載網(wǎng)頁圖片的實(shí)例講解
今天小編就為大家分享一篇Python3.x爬蟲下載網(wǎng)頁圖片的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python控制windows系統(tǒng)音量實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了Python控制windows系統(tǒng)音量實(shí)現(xiàn)實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
Python?selenium安裝+Microsoft?Edge驅(qū)動(dòng)器下載配置流程(最新推薦)
本文介紹了如何在Python自動(dòng)化Web瀏覽器背景下配置MicrosoftEdge瀏覽器驅(qū)動(dòng),主要內(nèi)容包括查看瀏覽器版本、下載對(duì)應(yīng)驅(qū)動(dòng)、配置環(huán)境以及安裝和驗(yàn)證Selenium庫,感興趣的朋友一起看看吧2025-02-02
對(duì)于Python異常處理慎用“except:pass”建議
這篇文章主要介紹了對(duì)于Python異常處理方法的建議,摘選自StackOverflow上的熱門問題的回答,闡述了except:pass的使用時(shí)需要注意的地方,需要的朋友可以參考下2015-04-04

