當前位置:
首頁 > 知識 > 使用Cython來保護Python代碼庫

使用Cython來保護Python代碼庫

使用Cython來保護Python代碼庫

Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。

最近,我在做一個需要使用Cython來保護整個代碼庫的Python項目。

起初儘管保護Python源碼免受逆向工程的影響似乎是一項徒勞無功的任務,但是所有代碼的cythonizing都會帶來合理的安全性(二進位文件非常難以拆解,但是還可以通過程序的猴子補丁程序來完成)。

這種安全性是有代價的 - Cython的主要用途是編寫可以輕鬆與Python代碼連接的編譯擴展。

因此,對複雜模塊/包結構的支持是相當有限的,我們必須做一些額外的工作來實現所需的結果。

我們必須克服的第一個障礙是很難用Cython編譯整個Python包(如「包含__init__.py文件的目錄」)。想像一下下面的結構:

使用Cython來保護Python代碼庫

推薦的cythonizing方法是使用setup.py文件,如下所示:

使用Cython來保護Python代碼庫

setup.py或多或少是使用Cython的項目所期望的。但是有兩件事要注意。第一,always_allow_keywords指令通過禁用具有大量參數的函數只允許使用關鍵字參數這一優化,使Flask視圖函數可以正常工作。其次,我們不使用一些指南建議的ext_package參數,因為這會將cythonized代碼放入另一個包中。通過省略這個參數,編譯的代碼保存在同一個地方。

但是,在使用python setup.py build_ext構建項目之後,我們注意到生成的程序包無法導入 - 它缺少__init__.py文件。__init__.so可以從Python導入,但這還不足以使目錄成為Python的一個包。 無法導入包不是唯一的問題 - 其中的代碼也無法執行包相對導入(例如.foo import foo),這會破壞其功能。

要解決這個問題,我們可以在構建項目的其餘部分後從源代碼樹中複製__init__.py文件。 一個很好的方法是覆蓋setup.py中的build_ext類:

使用Cython來保護Python代碼庫

我們已經成功地創建了可以導入的Python包。它們在build / lib.linux-x86_64-3.6或類似的目錄下。 遺憾的是,這不足以分發我們的包。理想情況下,我們希望安裝一個僅包含已編譯代碼的軟體包。目前Python存檔的標準是wheel格式(.whl),其目的是替換.egg格式。所以,讓我們嘗試用python setup.py bdist_wheel創建wheel格式! 命令完成後,應該有一個包含wheel文件的dist文件夾。打開就能產生這樣的東西:

使用Cython來保護Python代碼庫

顯然,歸檔不僅包含編譯代碼,還包含源代碼。有一種方法可以解決這個問題,但是它似乎是反直覺的。我們需要在調用setup時刪除packages參數中的包名。這樣,仍然可以構建擴展並包含在wheel中,但源代碼將不會在其中。

使用Cython來保護Python代碼庫

構建的wheel的內容應該如下所示:

使用Cython來保護Python代碼庫

可以使用pip install dist/*.whl安裝wheel。如果我們不需要檢查wheel或手動分配wheel,我們可以在項目目錄中運行pip install,構建並安裝wheel。

也可以從.egg存檔中刪除Python源代碼,但它涉及到從setuptools覆蓋bdist_egg命令。我不會在這裡覆蓋,但如果您有興趣,請查看上述命令類的--exclude-source-files選項和zap_pyfiles方法。

通過遵循本指南,你應該能夠利用複雜軟體包/模塊結構對Python代碼庫進行cythonize,從而讓惡意黑客難以對其進行逆向工程並竊取你的編程成果。


英文原文:https://bucharjan.cz/blog/using-cython-to-protect-a-python-codebase.html
譯者:大嘴

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

看NASA的編碼哲學
每月好書:Python與機器學習實戰
Python到底怎麼讀?
一個Python包,學會所有基礎演算法
回顧python中的單元測試和模擬

TAG:Python部落 |

您可能感興趣

iPhone X Plus保護殼曝光 還有台iPhone 9
How2work 限量推出奈良美智 iPhone 8 Plus 及 iPhone X 電話保護套
Identity Server 4-Hybrid Flow-使用ABAC保護MVC客戶端和API資源
上帝保護我們遠離一切災害 The LORD Who Keeps Us From All Harm
iPad變身Surface Pro羅技推Rugged Combo2鍵盤保護套
iPhone 9/iPhoneX Plus模型保護殼曝光 可靠性高
三星推Android數據保護和隱私保護Samsung Max應用程序
Mophie推出iPhone X充電保護套
iPhone SE2手機保護膜曝光,縮水版的iPhone X
如何繞過csrf保護,並在burp suite中使用intruder?
三星推出適用於Android數據保護和隱私保護Samsung Max應用程序
保護模特身心健康,LVMH 再度聯手 Kering 推出數字平台 WeCareForModels.com
iPhone的一個SurfacePad是光滑的皮革保護套X
9月新iPhone機模曝光,保護殼與iPhone X通用
iPhone X的Mophie Qi認證充電保護套即將推出
Mophie發布首款Qi認證的iPhone X充電保護殼
Mophie將會為三星Galaxy Note 9提供攜帶型電池保護殼
Twelve South推出蘋果AirPods皮革保護套,售價30美元
Daily Sharing-如何教孩子自我保護?
母公司申請破產保護,美國鞋履品牌 Nine West 或被出售給品牌管理公司 Authentic Brands