[验签] 如何利用 Python 完成验签操作

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

一、什么是验签:

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

二、情景再现:

  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()
  1. 请求的数据如下所示:
    param={"inputCodes":["6932608700850"],
    "terminal":{"status":1,"channel":"D002","storeCode":"2107","passage":"D002","storeName":"柠檬班 Python 全栈自动化","identity":"","maxProductCount":5,"posId":"D002"}}
  2. 随请求发送的请求头如下(sign 表示这里需要传递签名后的数据):
    header={"client_id":"DataSync","sign":"D74259421E46D25C9E81CF991B7075DB","Content-Type":"application/json;charset=UTF-8"}
  3. 要求以及说明:

三、解决难题:

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就是排序过后的字典
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())

最后完成的请求如下所示:
image.png

验签的操作就完成了!这个还是一种非常简单的验签,平常可能会需要添加时间戳等变动字段,但是解决方案是一样的!

1 操作
huahua 在 2020-08-07 21:54:04 更新了该帖
9 回帖
请输入回帖内容 ...
  • Lemfix_zdtx

    验签需要时间戳,哪就是直接把时间戳放到 header 中哇!!!👣

  • 其他回帖
  • Lemfix_zdtx

    好吧

  • huahua

    😂 加密的时候 会考虑到这个时间戳的问题。小朋友。

  • huahua

    😎 各位来了的小可爱,不来点个赞吗!!!

  • 查看更多回帖