由于python設(shè)計(jì)的初衷是開(kāi)源的,因此py文件是可以直接看到源碼的。但開(kāi)發(fā)商業(yè)軟件,代碼加密保護(hù)就比較重要了。
python編譯后程序
pyc文件是py文件經(jīng)過(guò)編譯后生成的二進(jìn)制文件,因此可以發(fā)布pyc文件以隱藏源代碼。pyc文件擁有更快的加載速度,執(zhí)行速度沒(méi)有區(qū)別。pyc是一種跨平臺(tái)的字節(jié)碼,pyc的內(nèi)容是跟python的版本相關(guān)的,不同版本編譯后的pyc文件是不同的,2.5編譯的pyc文件,2.4版本的python是無(wú)法執(zhí)行的。
python提供了內(nèi)置的類(lèi)庫(kù)來(lái)實(shí)現(xiàn)把py文件編譯為pyc文件,這個(gè)模塊就是py_compile模塊:
#生成單個(gè)pyc文件
python -m py_compile test.py
python -O -m py_compile test.py
# -O 優(yōu)化成字節(jié)碼(pyo)
# -m 表示把后面的模塊當(dāng)成腳本運(yùn)行
#-OO 表示優(yōu)化的同時(shí)刪除文檔字符串
#批量生成pyc文件
python -m compileall
對(duì)服務(wù)器腳本敏感信息加密的程序,就可以使用這種方式生成pyc文件,提高一層保護(hù)的功能,當(dāng)然反編譯在很大程度上還是能還原回來(lái)的:
#對(duì)程序進(jìn)行編譯
[root@localhost encrypt]# python -m py_compile optcrypt.py
[root@localhost encrypt]# python -m py_compile server.py
[root@localhost encrypt]# python -m py_compile __init__.py
#生成文件
[root@localhost encryptc]# ls
global.properties __init__.pyc optcrypt.pyc server.pyc test.sh
程序加密
目前軟件開(kāi)發(fā)商對(duì) Python 加密時(shí)可能會(huì)有兩種形式,一種是對(duì)python轉(zhuǎn)成的exe進(jìn)行保護(hù),另一種是直接對(duì).py或者.pyc文件進(jìn)行保護(hù),下面將列舉兩種形式的保護(hù)流程。
1.pyexe、PyInstaller、py2app 打包軟件
這些工具用于將一個(gè)Python項(xiàng)目打包成單個(gè)可執(zhí)行的文件,對(duì) python轉(zhuǎn)exe加殼,方便(在沒(méi)有Python環(huán)境的機(jī)器上)使用。但通過(guò)壓縮包可以方便地得到所有pyc文件或源文件,與C/C++編譯生成的可執(zhí)行文件有本質(zhì)上的區(qū)別,基本上是零保護(hù)。
2.對(duì).py/.pyc加密
第一步,使用加殼工具對(duì) python 安裝目錄下的 python.exe 進(jìn)行加殼,將 python.exe 拖入到加殼工具 VirboxProtector 中,配置后直接點(diǎn)擊加殼。
第二步,對(duì).py/.pyc 進(jìn)行加密,使用 DSProtector 對(duì).py/.pyc 進(jìn)行保護(hù)。
3.使用cython保護(hù)python的代碼
先安裝cython
pip install cython
然后安裝python開(kāi)發(fā)包
centos系統(tǒng)下
yum install python-devel
然后對(duì)python代碼文件進(jìn)行轉(zhuǎn)換:
cython hello.py --embed #把python代碼轉(zhuǎn)換成c代碼
會(huì)生成一個(gè)名為hello.c的c語(yǔ)言的源文件。
然后使用gcc編譯成二進(jìn)制可執(zhí)行文件,這時(shí)候需要制定頭文件、編譯選項(xiàng)、鏈接選項(xiàng):
gcc `python-config --cflags` `python-config --ldflags` hello.c -o hello
如果python版本較高的話(huà)可以使用
gcc `python3-config --cflags --ldflags` hello.c -o hello
這樣代碼就被編譯成二進(jìn)制的可執(zhí)行程序了。
鏈接錯(cuò)誤的話(huà)試試:
gcc `python-config --cflags` -o hello hello.c `python-config --ldflags`