python代碼的幾種常見(jiàn)加密方式分享
Python的文件類(lèi)型介紹:
- .py python的源代碼文件
- .pyc Python源代碼import后,編譯生成的字節(jié)碼
- .pyo Python源代碼編譯優(yōu)化生成的字節(jié)碼。pyo比pyc并沒(méi)有優(yōu)化多少,只是去掉了斷言
- .pyd Python的動(dòng)態(tài)鏈接庫(kù)(Windows平臺(tái))
- .so
常見(jiàn)的源碼保護(hù)手段有如下幾種:
1.發(fā)行.pyc文件
pyc文件是py文件經(jīng)過(guò)編譯后生成的二進(jìn)制文件,python提供py_compile內(nèi)置模塊把py文件編譯為pyc文件,得到的.pyc文件可以直接運(yùn)行python xxx.pyc
.pyc只能在特定版本的解釋器上運(yùn)行
1.1 編譯加密
mian.py
def spread(arg): ret = [] for i in arg: if isinstance(i, list): ret.extend(i) else: ret.append(i) return ret def deep_flatten(lst): result = [] result.extend( spread(list(map(lambda x: deep_flatten(x) if type(x) == list else x, lst)))) return result print(deep_flatten([1, [2], [[3], 4], 5]))
編譯指令:
python -m py_compile main.py
python -m compileall main.py
批量
1.2 是否可逆
- pyc加密現(xiàn)成的反編譯工具,可以反編譯得到源代碼.
- 使用uncompyle庫(kù)進(jìn)行反編譯
可逆
測(cè)試:
pip install uncompyle uncompyle6 main.cpython-38.pyc > main.py
1.3是否影響模塊調(diào)用
不影響使用
# coding=utf-8 # 調(diào)用模塊main from main import deep_flatten print(deep_flatten([1, [2], [[3], 4], 5]))
2.代碼混淆
- 1.1 降低代碼可讀性
- 1.2 不影響模塊之間調(diào)用
3.生成exe可執(zhí)行文件
使用py2exe
py2exe是將Python代碼轉(zhuǎn)換為 Windows 平臺(tái)上的可執(zhí)行文件的工具,只能在windos上使用,原理是譯為 .pyc 文件,加上一些動(dòng)態(tài)連接依賴(lài)文件,一起打包成一個(gè)可執(zhí)行文件。
pip install py2exe
需要編寫(xiě)setup.py文件:
#!/usr/bin/env python from distutils.core import setup import py2exe setup(console=[f'E:\_Py_Project\leanPy\work\代碼加密\main1.py'])
然后執(zhí)行 python setup.py py2exe
- 1.1 是否可逆
不可逆
- 1.2 是否影響模塊調(diào)用
不影響
4…py文件轉(zhuǎn)化為.so文件
生成使用 Cython
它的原理:將 .py/.pyx 編譯為 .c文件,再將 .c文件編譯為 .so(Unix) 或 .pyd(Windows)
pip install Cython
setup.py
from distutils.core import setup from Cython.Build import cythonize setup(name='main1', ext_modules=cythonize(f'E:\_Py_Project\leanPy\work\代碼加密\main1.py'))
python setup.py build_ext
在windos下生成.pyd文件
測(cè)試 .pyd文件,把mian1.py刪除,把.pyd文件移動(dòng)到.py原來(lái)目錄下
在linux下生成.so文件
測(cè)試:
- 1.1 是否可逆:
不可逆
- 1.2 是否影響模塊調(diào)用
不影響
5.附加運(yùn)行輔助包文件
pip install pyarmor==6.8.1
pyarmor obfuscate main.py
同目錄下所有的 *.py文件都會(huì)被加密
方式一:高級(jí)加密模式,需要引導(dǎo)代碼
方式二:超級(jí)加密模式
超級(jí)模式只需要一個(gè)運(yùn)行輔助文件,沒(méi)有了所謂的引導(dǎo)代碼
pyarmor obfuscate --advanced 2 .\main1.py
方式三: 虛擬加密模式
高級(jí) + 虛擬
pyarmor obfuscate --advanced 3 .\main1.py
超級(jí) + 虛擬
pyarmor obfuscate --advanced 4 .\main1.py
輔助文件和編譯文件
幾種加密方式對(duì)比:
到此這篇關(guān)于python代碼的幾種常見(jiàn)加密方式分享的文章就介紹到這了,更多相關(guān)python加密方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析AST抽象語(yǔ)法樹(shù)及Python代碼實(shí)現(xiàn)
Abstract Syntax Tree抽象語(yǔ)法樹(shù)簡(jiǎn)寫(xiě)為ATS,是相當(dāng)于用樹(shù)結(jié)構(gòu)將代碼程式表現(xiàn)出來(lái)的一種數(shù)據(jù)結(jié)構(gòu),這里我們就來(lái)淺析AST抽象語(yǔ)法樹(shù)及Python代碼實(shí)現(xiàn)2016-06-06利用python實(shí)現(xiàn)詞頻統(tǒng)計(jì)分析的代碼示例
詞頻統(tǒng)計(jì)是指在文本或語(yǔ)音數(shù)據(jù)中,統(tǒng)計(jì)每個(gè)單詞或符號(hào)出現(xiàn)的次數(shù),以便對(duì)文本或語(yǔ)音數(shù)據(jù)進(jìn),這篇文章將詳細(xì)介紹分詞后如何進(jìn)行詞頻統(tǒng)計(jì)分析2023-06-06Python中實(shí)現(xiàn)字符串類(lèi)型與字典類(lèi)型相互轉(zhuǎn)換的方法
這篇文章主要介紹了Python中實(shí)現(xiàn)字符串類(lèi)型與字典類(lèi)型相互轉(zhuǎn)換的方法,非常實(shí)用,需要的朋友可以參考下2014-08-08Python隨機(jī)驗(yàn)證碼生成和join?字符串的問(wèn)題解析
Python中有join()和os.path.join()兩個(gè)函數(shù),join是將字符串、元組、列表中的元素以指定的字符(分隔符)連接生成一個(gè)新的字符串而os.path.join():?將多個(gè)路徑組合后返回,本文給大家介紹的非常詳細(xì),需要的朋友一起看看吧2022-04-04Python OOP類(lèi)中的幾種函數(shù)或方法總結(jié)
今天小編就為大家分享一篇關(guān)于Python OOP類(lèi)中的幾種函數(shù)或方法總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Python如何一行輸入多個(gè)數(shù),并存入列表
這篇文章主要介紹了Python如何一行輸入多個(gè)數(shù),并存入列表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05python 工具 字符串轉(zhuǎn)numpy浮點(diǎn)數(shù)組的實(shí)現(xiàn)
這篇文章主要介紹了python 工具 字符串轉(zhuǎn)numpy浮點(diǎn)數(shù)組的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03python魔法方法-屬性轉(zhuǎn)換和類(lèi)的表示詳解
下面小編就為大家?guī)?lái)一篇python魔法方法-屬性轉(zhuǎn)換和類(lèi)的表示詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07