像Python這種解釋性的語(yǔ)言,要想私有化部署的同時(shí)又保護(hù)好源碼,就像是對(duì)于魚和熊掌的追求。
創(chuàng)新互聯(lián)公司技術(shù)團(tuán)隊(duì)10多年來(lái)致力于為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、品牌網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了近千家網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。
雖然做不到盡善盡美,但是對(duì)代碼進(jìn)行混淆,增加一點(diǎn)破解的難度,或許能規(guī)避一些泄露的風(fēng)險(xiǎn)。
本次演示環(huán)境:linux
確保要發(fā)布的包根目錄("demo")中有__main__.py文件,這個(gè)是程序執(zhí)行入口。
編譯
批量改名.pyc文件
移動(dòng).pyc文件
清理.py文件
清理__pycache__文件夾
打包成zip
運(yùn)行時(shí)只要將zip文件作為參數(shù)即可
最終整合腳本
調(diào)用方式
對(duì)于在變量和函數(shù)名上的混淆有點(diǎn)小兒科,而對(duì)于跨文件的類名的混淆又太容易實(shí)現(xiàn)。
所以對(duì)于混淆程度的取舍,要視工程的規(guī)模而定。
2.1 混淆工具pyminifier
在原來(lái)的工具 pyminifier上修復(fù)了幾個(gè)bug。
安裝:
python3 安裝
或者clone下來(lái),自行安裝
使用例子
2.2 源碼變更
不同的配置對(duì)于源碼的要求不同,以下是筆者踩過的坑。
其他混淆想法
結(jié)合混淆、編譯和打包,嘗試出以下發(fā)布腳本。
主要的思路 :創(chuàng)建一個(gè)工作目錄tmp,然后在此目錄下混淆、編譯python代碼,完成后把內(nèi)容打包成pyc文件,再將pyc文件和其他配置文件移動(dòng)到dist,發(fā)布dist即可。
混淆的目的是最大程度保護(hù)源碼,在發(fā)布到客戶端后不被輕易破解。
1.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
參數(shù)分別為y實(shí)際類別、預(yù)測(cè)類別、返回值要求(True返回正確的樣本占比,false返回的是正確分類的樣本數(shù)量)
eg:
import numpy as np
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
accuracy_score(y_true, y_pred)
0.5
accuracy_score(y_true, y_pred, normalize=False)
2.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2)
參數(shù):真是類別,預(yù)測(cè)類別,目標(biāo)類別名稱
eg:
3.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
輸出為混淆矩陣
eg:
太多了,寫3個(gè)常用的吧,具體參考help(metrics)
defcm_plot(y,yp):#參數(shù)為實(shí)際分類和預(yù)測(cè)分類
fromsklearn.metricsimportconfusion_matrix
#導(dǎo)入混淆矩陣函數(shù)
cm = confusion_matrix(y,yp)
#輸出為混淆矩陣
importmatplotlib.pyplotasplt
#導(dǎo)入作圖函數(shù)
plt.matshow(cm,cmap=plt.cm.Greens)
# 畫混淆矩陣圖,配色風(fēng)格使用cm.Greens
plt.colorbar()
# 顏色標(biāo)簽
forxinrange(len(cm)):
foryinrange(len(cm)):
plt.annotate(cm[x,y],xy=(x,y),horizontalalignment='center',verticalalignment='center')
#annotate主要在圖形中添加注釋
# 第一個(gè)參數(shù)添加注釋
# 第一個(gè)參數(shù)是注釋的內(nèi)容
# xy設(shè)置箭頭尖的坐標(biāo)
#horizontalalignment水平對(duì)齊
#verticalalignment垂直對(duì)齊
#其余常用參數(shù)如下:
# xytext設(shè)置注釋內(nèi)容顯示的起始位置
# arrowprops 用來(lái)設(shè)置箭頭
# facecolor 設(shè)置箭頭的顏色
# headlength 箭頭的頭的長(zhǎng)度
# headwidth 箭頭的寬度
# width 箭身的寬度
plt.ylabel('True label')# 坐標(biāo)軸標(biāo)簽
plt.xlabel('Predicted label')# 坐標(biāo)軸標(biāo)簽
returnplt
#函數(shù)調(diào)用
cm_plot(train[:,3],tree.predict(train[:,:3])).show()
#?-*-?coding:?UTF-8?-*-
"""繪制混淆矩陣圖"""
import?matplotlib.pyplot?as?plt
from?sklearn.metrics?import?confusion_matrix
def?confusion_matrix_plot_matplotlib(y_truth,?y_predict,?cmap=plt.cm.Blues):
"""Matplotlib繪制混淆矩陣圖
parameters
----------
y_truth:?真實(shí)的y的值,?1d?array
y_predict:?預(yù)測(cè)的y的值,?1d?array
cmap:?畫混淆矩陣圖的配色風(fēng)格,?使用cm.Blues,更多風(fēng)格請(qǐng)參考官網(wǎng)
"""
cm?=?confusion_matrix(y_truth,?y_predict)
plt.matshow(cm,?cmap=cmap)??#?混淆矩陣圖
plt.colorbar()??#?顏色標(biāo)簽
for?x?in?range(len(cm)):??#?數(shù)據(jù)標(biāo)簽
for?y?in?range(len(cm)):
plt.annotate(cm[x,?y],?xy=(x,?y),?horizontalalignment='center',?verticalalignment='center')
plt.ylabel('True?label')??#?坐標(biāo)軸標(biāo)簽
plt.xlabel('Predicted?label')??#?坐標(biāo)軸標(biāo)簽
plt.show()??#?顯示作圖結(jié)果
if?__name__?==?'__main__':
y_truth?=?[1,?0,?1,?1,?1,?1,?1,?1,?1,?1,?0,?0,?0,?0,?0]
y_predict?=?[1,?0,?0,?1,?0,?1,?1,?1,?1,?1,?0,?1,?0,?1,?0]
confusion_matrix_plot_matplotlib(y_truth,?y_predict)