如何利用 Python 完成验签操做

柠檬班Python8期的佑佑以及Python7期的掠掠同窗昨天都私下问华华老师如何利用Python完成验签的操做。 今天咱们就以佑佑的例子来跟你们进行简单的说明以及操做!算法

1、什么是验签:

用很是简单的话来描述:有一个发送消息的端 A 有一个接收消息的端B ,以及A发给B的信息 msg,发送过程要进行签名(相似于对数据加密成一个sign)
A对发送的msg进行加密签名,随请求发送一个sign
B接收消息,要对sign进行验签,检测消息发送端以及来源是否安全与正确。
注意:sign的生成跟发送的信息有关,且有专门的加密算法。json

2、情景再现:

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)要求以及说明:函数

  • 请求传递的数据param以及利用md5Encode函数对参数进行加密生成的sign的字段顺序要如出一辙
  • 难点在于:param是一个字典,没法保证它的顺序
  • 解题思路:对字典param进行排序,使之成为有序的字典形式

3、解决难题:

  • 先利用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就是加密后的签名
  • 把sign替换到head这个数据里面去,发起请求
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

相关文章
相关标签/搜索