一日一技:如何正確保護(hù)Python代碼
去年我寫過一篇文章《一日一技:如何對Python代碼進(jìn)行混淆》介紹過一個混淆Python代碼的工具,叫做pyminifier,這個東西混淆出來的代碼,咋看起來有模有樣,但仔細(xì)一看,本質(zhì)上就是變量名替換而已,只要耐下心來就能看懂,如下圖所示:
圖片
而我今天要介紹另一個工具,叫做pyarmor。pyminifier跟它比起來,就跟玩具一樣。
pyarmor使用pip就可以安裝:pip install pyarmor。pyarmor是一個收費工具,但免費也能使用。免費版有絕大部分功能,加密小的腳本足夠了。
我們今天要測試的腳本如下圖所示:
圖片
運(yùn)行以后如下圖所示:
圖片
現(xiàn)在,執(zhí)行命令pyarmor g json_path_finder.py。對這個腳本進(jìn)行加密,會在dist文件夾中生成加密后的文件,如下圖所示:
圖片
加密后的文件打開以后長這樣:
圖片
這個代碼,人已經(jīng)完全沒法看懂了。雖然代碼看不懂,但可以正常運(yùn)行,如下圖所示:
圖片
需要注意的是,pyarmor會生成一個二進(jìn)制文件pyarmor_runtime_000000。這個文件需要和加密后的程序放在一起,才能正常使用。
如果僅僅是這樣,那pyarmor只能算是一個加強(qiáng)版的pyminifier。而它更強(qiáng)大的地方是,可以設(shè)置程序的過期時間。執(zhí)行代碼:
pyarmor g -e 30 json_path_finder.py
設(shè)定程序30天以后過期。
也可以使用絕對日期:
pyarmor g -e 2024-08-30 json_path_finder.py
當(dāng)時間過了以后,運(yùn)行加密后的程序,會報錯:
圖片
并且可以通過一個參數(shù)確保這個過期時間跟電腦時間無關(guān),而是從一個授時服務(wù)器上面的時間來判斷:
pyarmor cfg nts=pool.ntp.org
pyarmor g -e 2024-08-30 json_path_finder.py
如下圖所示:
圖片
不僅可以設(shè)定過期時間,還可以綁定電腦的mac地址,這樣一來,只有特定的電腦才能運(yùn)行:
pyarmor g -b <mac地址> json_path_finder.py
除了mac地址,也可以綁定IP地址、電腦序列號,如下圖所示:
pyarmor g -b 128.16.4.10 foo.py
pyarmor g -b HXS2000CN2A foo.py
有了這個工具,以后做私活時,就不用擔(dān)心用戶拿到代碼以后跑路了。還可以讓用戶定期付費。
pyarmor非常強(qiáng)大,可以在官方文檔中看到更多用法,比如對一個package進(jìn)行加密。