zoukankan      html  css  js  c++  java
  • 如何利用 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()

    2)请求的数据如下所示:

    param={"inputCodes":["6932608700850"], "terminal":{"status":1,"channel":"D002",
    "storeCode":"2107","passage":"D002","storeName":"柠檬班Python全栈自动化","identity":"","maxProductCount":5,"posId":"D002"}}

    3)随请求发送的请求头如下(sign表示这里需要传递签名后的数据):

     header={"client_id":"DataSync","sign":"D74259421E46D25C9E81CF991B7075DB","Content-Type":"application/json;charset=UTF-8"}

    4)要求以及说明:

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

    三、解决难题:

    • 先利用collections模块里面的OrderedDict来对字典完成排序 from collections import OrderedDict

      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转成字符串。

    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())

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

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

  • 相关阅读:
    【权值分块】bzoj1208 [HNOI2004]宠物收养所
    【权值分块】bzoj1588 [HNOI2002]营业额统计
    【权值分块】bzoj1503 [NOI2004]郁闷的出纳员
    【pb_ds】bzoj1056 [HAOI2008]排名系统 bzoj1862 [Zjoi2006]GameZ游戏排名系统
    【分块】【树状数组】bzoj3744 Gty的妹子序列
    【权值分块】bzoj3685 普通van Emde Boas树
    【权值分块】bzoj3224 Tyvj 1728 普通平衡树
    【搜索】数学组の问题
    【块状链表】AutSky_JadeK的块状链表模板+总结(STL版)
    【DFS】【最短路】【spfa】【BFS】洛谷P2296 NOIP2014提高组 day2 T2 寻找道路
  • 原文地址:https://www.cnblogs.com/liulinghua90/p/10064728.html
Copyright © 2011-2022 走看看