檸檬班Python8期的佑佑以及Python7期的掠掠同窗昨天都私下問華華老師如何利用Python完成驗籤的操做。 今天咱們就以佑佑的例子來跟你們進行簡單的說明以及操做!算法
用很是簡單的話來描述:有一個發送消息的端 A 有一個接收消息的端B ,以及A發給B的信息 msg,發送過程要進行簽名(相似於對數據加密成一個sign)
A對發送的msg進行加密簽名,隨請求發送一個sign
B接收消息,要對sign進行驗籤,檢測消息發送端以及來源是否安全與正確。
注意:sign的生成跟發送的信息有關,且有專門的加密算法。json
1)加密的算法以下所示(Python代碼):安全
def md5Encode(param): client_secret='F0897E16-5D1E-4A31-9644-BBF974E2DD88'#此爲加密的祕鑰 sign=param+client_secret m = hashlib.md5(sign.encode(encoding='utf-8')) return m.hexdigest().upper()
2)請求的數據以下所示:app
param={"inputCodes":["6932608700850"], "terminal":{"status":1,"channel":"D002",
"storeCode":"2107","passage":"D002","storeName":"檸檬班Python全棧自動化","identity":"","maxProductCount":5,"posId":"D002"}}
3)隨請求發送的請求頭以下(sign表示這裏須要傳遞簽名後的數據):ide
header={"client_id":"DataSync","sign":"D74259421E46D25C9E81CF991B7075DB","Content-Type":"application/json;charset=UTF-8"}
4)要求以及說明:函數
先利用collections模塊裏面的OrderedDict來對字典完成排序 from collections import OrderedDictpost
param={"inputCodes":["6932608700850"], "terminal":{"status":1,"channel":"D002","storeCode":"2107", "passage":"D002","storeName":"檸檬班Python全棧自動化","identity":"","maxProductCount":5,"posId":"D002"}} dict_2=OrderedDict() for item in param: if type(item)==dict: dict_sub=OrderedDict() for key in item: dict_sub[key]=item[key] dict_2[item]=dict_sub else: dict_2[item]=param[item] #最後獲得的dict_2就是排序事後的字典
利用md5Encode函數對param進行加密,可是md5Encode只能對字符串進行加密,因此要先利用json轉成字符串。ui
str_data=json.dumps(dict_2) sign=md5Encode(str_data) #獲得的sign就是加密後的簽名
header={"client_id":"DataSync","sign":sign,"Content-Type":"application/json;charset=UTF-8"} res=requests.post(url,json=dict_2,headers=header,verify=False) print(res.json())
最後完成的請求以下所示:加密
驗籤的操做就完成了!這個仍是一種很是簡單的驗籤,日常可能會須要添加時間戳等變更字段,可是解決方案是同樣的!url