防止程式碼被竊取,Python程式碼加密常用方案

jingsupo發表於2024-05-30

基礎:Python檔案格式
為了理解python程式碼加密的基本原理,首先來了解下python的檔案格式。

.py python原始碼
這個大家都知道,不做過多闡述。這裡著重介紹下Python程式碼的執行。

Python 程式碼的執行過程和 Java 類似:

將.py檔案編譯得到 Python 的位元組碼
Python 虛擬機器(Python Virtual Machine) 執行編譯好的位元組碼
Python 虛擬機器和 Java 的 JVM 類似,但 Python虛擬機器的抽象化程度更高(但不是效能更強)

.pyc 編譯得到的位元組碼檔案
在首次匯入一個python庫的時候,為了讓以後再次匯入更方便也更快,python會構建一個包含該庫的位元組碼*.pyc檔案

你可以在你的庫檔案的__pycache__資料夾下看到每個.py檔案對應的.pyc檔案

.pyo 編譯最佳化後得到的位元組碼檔案
Python 3.5之前將*.pyc檔案透過最佳化器(-O)建立的檔案,可以略微提升載入速度

Python 3.5 之後已經取消了.pyo檔案的概念,最佳化後的檔案也會以.pyc檔案儲存

從.pyc或.pyo檔案中讀取程式比從.py檔案中讀取得更快,但只是最佳化了載入速度,不會最佳化執行速度

.pyd 可被Python呼叫的Windows DLL檔案
基本的Windows DLL檔案,是Python的動態連結庫
並非從python程式碼生成,而是其他語言寫成的可以被Python呼叫的Windows DLL檔案,例如C++
關於Windows DLL檔案的介紹可以參看 Microsoft-什麼是DLL?

基礎加密:.pyc加密
加密難度:⭐️
安全性:⭐️

最基礎的加密方法是利用 Python 自帶的編譯器將原始碼檔案.py 編譯得到的二進位制的位元組碼檔案.pyc。.pyc只能在特定版本的直譯器上執行。
二進位制的位元組碼檔案對於初學者而言有一定的程式碼隱藏作用,但也只能簡單隱藏。
在命令列中輸入如下程式碼可以得到.pyc檔案:

編譯指令:

  • python -m py_compile main.py
  • python -m compileall main.py 批次

在.\__pycache__目錄下可以看到位元組碼檔案.pyc

位元組碼檔案.pyc可以在別的Python檔案中匯入使用,也可以直接執行。

但是位元組碼檔案極易被反編譯得到原始碼。

進階加密:.pyd/.so加密
加密難度:⭐️ ⭐️ ⭐️
安全性:⭐️ ⭐️ ⭐️

Cython是一個程式語言,它透過類似Python的語法來編寫C擴充套件並可以被Python呼叫。能夠將Python+C混合編碼的.pyx指令碼轉換為C程式碼,主要用於最佳化Python指令碼效能或Python呼叫C函式庫。基於它的原理,我們可以得到一種程式碼加密的思路:將 .py/.pyx 編譯為 .c 檔案,再將 .c 檔案編譯為 .so(Unix) 或 .pyd(Windows),這樣得到的檔案更難反編譯。

原理:將 .py/.pyx 編譯為 .c檔案,再將 .c檔案編譯為 .so(Unix) 或 .pyd(Windows)

注意:Windows環境下使用該庫可能需要配置Microsoft Visual C++相關庫

1
pip install Cython

setup.py

1
2
3
4
from distutils.core import setup
from Cython.Build import cythonize
setup(name='main', ext_modules=cythonize('main.py'))

python setup.py build_ext

Linux環境下相關報錯:fatal error: Python.h: No such file or directory

原因:包含需要編譯的呼叫python api的c/c++檔案,而Linux發行版通常會把類庫的標頭檔案和相關的pkg-config分拆成一個單獨的xxx-dev(el)包。以python為例,以下情況你是需要python-dev的:

ubuntu下

apt-get install python-dev
apt-get install python3-dev

centos下

 yum -y install python-devel
 yum -y install python3-devel

注意如果是python3可以直接安裝python3-dev

關於這種加密方法的安全性,筆者目前尚未發現能將.so/.pyd檔案直接反編譯為.py的方法,因此較為可靠。

相關文章