柠檬班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":[""], "terminal":{"status":1,"channel":"D002",
"storeCode":"","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":[""],
    "terminal":{"status":1,"channel":"D002","storeCode":"",
    "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())

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

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

如何利用 Python 完成验签操作的更多相关文章

  1. python md5验签

    import hashlib #api验签 参数按首字母排序,然后拼接clientid=123456&num=xxxx&status=1&timestamp=157319776 ...

  2. RSA - 原理、特点(加解密及签名验签)及公钥和私钥的生成

    Wiki - RSA加密演算法 Wiki - 欧拉函数 Wiki - 模反元素 ASN.1 格式标准 RSA算法原理(二) 注意: RSA 加密或签名后的结果是不可读的二进制,使用时经常会转为 BAS ...

  3. RSA体系 c++/java相互进行加签验签--转

    在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java ...

  4. java安全入门篇之接口验签

    文章大纲 一.加密与验签介绍二.接口验签实操三.项目源码下载   一.加密与验签介绍   大多数公共网络是不安全的,一切基于HTTP协议的请求/响应(Request or Response)都是可以被 ...

  5. Java Http接口加签、验签操作方法

    1.业务背景 最近接触了一些电商业务,发现在处理电商业务接口时,比如淘宝.支付类接口,接口双方为了确保数据参数在传输过程中未经过篡改,都需要对接口数据进行加签,然后在接口服务器端对接口参数进行验签,确 ...

  6. Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战

    一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...

  7. 利用SHA-1算法和RSA秘钥进行签名验签(带注释)

    背景介绍 1.SHA 安全散列算法SHA (Secure Hash Algorithm)是美国国家标准和技术局发布的国家标准FIPS PUB 180-1,一般称为SHA-1.其对长度不超过264二进制 ...

  8. Python 利用Python操作excel表格之openyxl介绍Part2

    利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436) ## 绘图 c = LineChart()    ...

  9. Python 利用Python操作excel表格之openyxl介绍Part1

    利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436),免费获取以下性能监控工具(类似Nmon精简版) ...

随机推荐

  1. BZOJ5251 八省联考2018劈配(网络流)

    劈配,匹配,网络流.那么考虑怎么跑网络流. 先看第一问.首先套路的建出超源超汇.不用想也知道导师向汇连容量为战队人数上限的边.特别地,给出局也建一个点,向汇连容量inf的边(似乎没有必要).对于一个新 ...

  2. Java 8 的 Metaspace

    Java 8 的 Metaspace https://www.cnblogs.com/xrq730/p/8688203.html 被废弃的持久代 想起之前面试的时候有面试官问起过我一个问题:Java ...

  3. Linux开机自动挂载存储的两种方式

    登录服务器,给查看了下,发现确实是没有自动加载,df -h只能显示本地硬盘的分区,fdisk -l 还是能看到存储空间,这说明这个服务器连接存储是木有问题的. 输入history | grep mou ...

  4. Oracle11g创建表空间

    第1步:创建临时表空间   create temporary tablespace pgenius_temp tempfile '\data\oracle\oracledata\pgenius_tem ...

  5. 安装Prometheus-Opeartor

    一.下载git clone clone https://github.com/coreos/prometheus-operator.git或:wget https://github.com/coreo ...

  6. Java内存模型基础

    Java内存模型的基础 并发编程模型的两个关键问题 在并发编程种,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在 ...

  7. 修复VirtualBox "This kernel requires the following features not present on the CPU: pae Unable to boot – please use a kernel appropriate for your CPU"

    异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 修复VirtualBox "This kernel requires ...

  8. Learn Python The Hard Way, 2nd Edition

    看完了这本书,你决定继续做编程.也许它能成为你的一个职业,也许它能成为你的一项爱好.但你需要一些指导,确保自己不会走错了道路,或帮助你从这个新业余爱好中得到最大的乐趣. 我做了很久的编程.久的你都想象 ...

  9. Linux查看端口、进程信息

    1.linux上如何查看端口 通常情况下,某个端口号会被莫名其妙的占用了.却不知道什么东东占用了,影响心情.通过如下命令,即可查看某一个端口号是否被占用 1)lsof -i:端口号,即可查看某一端口的 ...

  10. 出现“java.lang.AssertionError: SAM dictionaries are not the same”报错

    运行一下程序时出现“java.lang.AssertionError: SAM dictionaries are not the same”报错 java -jar picard.jar SortVc ...