使用Pyarmor保護Python腳本不被反向工程
譯文譯者 | 布加迪
審校 | 重樓
Python可讀性強,使用廣泛。雖然這種可讀性有利于協作,但也增加了未授權訪問和濫用的風險。如果未采取適當的保護,競爭對手或惡意攻擊者可以復制您的算法和專有邏輯,這將對您軟件的完整性和用戶的信任產生負面影響。
實施可靠的安全措施(比如混淆和許可證驗證)可以增強軟件防范潛在威脅的能力。保護Python腳本不僅僅是一種實踐,還是確保創新的保密性和在數字環境中保持用戶信任的關鍵策略。
了解Pyarmor
Pyarmor是一個命令行庫。它有助于保護和混淆Python腳本和軟件包。它將原始Python代碼轉換成一種更難以理解的形式,同時保持其功能。混淆過程將變量、函數和類重命名為非描述性名稱,還刪除注釋并重構代碼。這使得代碼難以被反向工程、篡改或復制。
Pyarmor可以保護單個的Python腳本和整個軟件包,甚至可以為代碼添加許可證驗證。
安裝Pyarmor庫
Pyarmor在Python軟件包索引(PyPI)中可用。使用pip安裝它,只需運行以下命令:
pip install pyarmor
不必非得將Pyarmor安裝在托管項目的同一個目錄中。您可以將其安裝在計算機上的任何位置,能夠保護來自任何目錄的任何Python腳本。
然而,如果您希望運行受保護的腳本,不必在目標機器上安裝Pyarmor,則需要將其安裝在托管項目的同一個目錄中。這是由于受保護的腳本將包含對Pyarmor運行時環境的引用,為了運行腳本,需要有Pyarmor運行時環境。
保護單個Python腳本
使用Pyarmor保護單個腳本很簡單。添加兩個數字的下列腳本將充當示例。
def add_numbers(num1, num2):
result = num1 + num2
print("The sum of {} and {} is: {}".format(num1, num2, result))
# Example usage
num1 = float(input("Enter the first number: "))
num2 = float(input("Enter the second number: "))
add_numbers(num1, num2)
使用命令行導航到已安裝Pyarmor的目錄。然后運行以下命令,對腳本進行加密和模糊處理。將main.py換成腳本的名稱。
pyarmor gen --output dist main.py
運行該命令后,Pyarmor將創建一個名為dist的新文件夾,其中含有您的受保護腳本。
打開受保護的腳本以查看其內容。
上面的屏幕截圖顯示了Pyarmor對簡單的加法腳本進行模糊和加密處理后的輸出。現在,您無法僅通過查看腳本來判斷其功能。
要運行受保護的腳本,打開終端或命令提示,并導航到含有dist目錄的位置。然后使用以下命令運行腳本:
python dist/main.py
將main.py換成您腳本的名稱。不用混淆處理,腳本應該可以按原狀運行。全面測試它,以確保所有函數都按預期工作。
保護整個Python軟件包
軟件包可能含有幾個模塊或數百個模塊,這取決于其用途。單獨維護每個模塊可能會很煩人。幸好,Pyarmor能夠保護整個軟件包,而不必單獨指定每個模塊。
假設您有一個名為sample_package的簡單Python軟件包,其結構如下:
sample_package/
|-- __init__.py
|-- module1.py
|-- module2.py
您可以創建任意數量的模塊。
要加密和混淆軟件包,打開終端或命令提示,并導航到軟件包所在的目錄。然后執行以下命令:
pyarmor gen -O dist -r -i sample_package
將sample_package換成您軟件包的名稱。該命令將加密和模糊軟件包目錄,并將受保護的輸出保存到dist目錄。像使用其他任何Python軟件包一樣使用受保護的軟件包。
比如說,要使用上面的示例軟件包,在dist目錄下創建一個新腳本:
from my_package import module1, module2
module1.say_hello()
module2.do_something()
您運行代碼時,軟件包應該像保護它之前一樣運行。
控制對腳本的訪問
您可能希望限制用戶運行腳本的時間,比如在試用期間。
要限制腳本運行的時間,請在對腳本進行混淆處理時使用以下命令。
pyarmor gen -O dist -e 30 main.py
將30換成您希望腳本處于活動狀態的天數。您也可以用一個確切的日期來代替。幾天過后,腳本將過期。
您可以通過設置過去的日期來測試此功能。這將使運行腳本拋出一個錯誤。使用以下命令用過期日期對腳本進行混淆處理:
pyarmor gen -O dist -e 2022-01-01 main.py
然后運行受保護的腳本。
錯誤顯示許可證密鑰已過期,因此腳本無法運行。
兼顧安全與效率
雖然Pyarmor提供了強大的混淆機制來增強代碼的安全性,但兼顧安全措施與維護軟件的效率和性能非常重要。您可以這么做:
- 評估是否需要混淆:如果您的軟件涉及專有算法、敏感數據或獨特的業務邏輯,混淆處理大有益處。然而,針對基本上沒有知識產權問題的開源腳本,安全與性能之間的權衡更傾向于效率。
- 評估性能影響:由于針對代碼采取的額外操作和轉換,混淆帶來了額外的運行開銷。這種影響對于小腳本來說可以忽略不計,但是對于大型項目來說比較明顯。您應該仔細評估混淆對性能的影響,并進行測試,以確保軟件保持響應能力和效率。
- 進行定期更新和維護:定期更新混淆的代碼、許可證和安全機制,以防止潛在的漏洞。還要考慮盡量減少對用戶造成的干擾。
有人能破解混淆處理的代碼嗎?
軟件破解是指解除軟件應用程序的復制保護或許可機制的行為,目的是為了無需付費,未經授權訪問軟件的全部功能。重點需要注意的是混淆處理軟件并不能完全保護它避免破解。
只要有足夠的決心和資源,就可以破解混淆處理的代碼。這就需要您應該定期進行更新和維護,以修補任何可疑的漏洞。
原文標題:Safeguard Your Python Scripts Against Reverse Engineering With Pyarmor,作者:Denis Kuria