PYTHON实现SIGN签名的过程解析


Posted in Python onOctober 28, 2019

sign签名是用于提供给外部(第三方)调用的接口,调用方需要提供正确的appkey钥匙才能调用,确保了接口的安全性。

签名参数sign生成方法:

假设有请求参数如下:

appkey = "111222333"
body = {
  "username": "Test",
  "Password": "123456",
  "mail": "",
  "sign": "xxx"
}

第一步:将所有参数(注意是所有参数),除去sign本身,以及值为空的参数,转化为键值对,没有等于号的字符串。

期望的结果如下:

["usernameTest","Password123456"]

代码实现2种方式:

1:for循环实现:

list = []
for i in body.items():
  if i[1] != "" and i[0] != "sign":
    list.append("".join(i))
print(list)

2:列表生成式实现:

s = ["".join(i) for i in body.items() if i[1] != "" and i[0] != "sign"]
print(s)

2种方式打印出来的实际结果如下:

PYTHON实现SIGN签名的过程解析

第二步:排序后的参数按照参数1值1,参数2值2的键值对顺序拼接成一个字符串,按参数名字母顺序升序排序。(具体升降顺序得问开发,一般为升序)

期望的结果如下:(按字母顺序:Password开头的在username前面)

“Password123456usernameTest”

代码实现:

# TODO 按字母升序排序
sort = "".join(sorted(list))
print(sort)

实际结果:

PYTHON实现SIGN签名的过程解析

第三步:在前面得到的字符串后面,加上接入方验证密匙appkey。

期望结果:

Password123456usernameTest111222333

代码实现:

# todo 3:在第二步得到的字符串后面,加上接入方验证密匙key,然后计算md5值,
result = sort+appkey
print(result)

实际结果:

PYTHON实现SIGN签名的过程解析

第四步:然后将这个字符串换为小写进行md5加密计算,得到的这个值即为sign签名值。

注意,计算md5之前请确保接口与接入方的字符串编码一致,如统一使用utf-8编码或者GBK编码,如果编码方式不一致则计算出来的签名会校验失败。

代码实现:

# todo MD5加密,固定的写法
def jiami(params):
  m = hashlib.md5()
  m.update(params.encode("utf-8"))
  return m.hexdigest()

sign = jiami(result.lower())  #lower()把字符转为小写
print(sign)

实际结果:

PYTHON实现SIGN签名的过程解析

全部过程如下:

'''sign签名主要是用于提供给外部(第三方)调用的接口,需要提供appkey钥匙才能调用'''
import hashlib


appkey = "111222333"
body = {
  "username": "Test",
  "Password": "123456",
  "mail": "",
  "sign": "xxx"
}
# todo 第1步: 将所有参数(注意是所有参数),除去sign本身,以及值是空的参数,转化为键值对的

#s = ["".join(i) for i in body.items() if i[1] != "" and i[0] != "sign"]
#print(s)

list = []
for i in body.items():
  if i[1] != "" and i[0] != "sign":
    list.append("".join(i))
print(list)


# todo 2:排序后的参数按照参数1值1,参数2值2的键值对顺序拼接成一个字符串,按参数名字母升序排序
# TODO 按字母升序排序
sort = "".join(sorted(list))
print(sort)

# todo 3:在第二步得到的字符串后面,加上接入方验证密匙key,然后计算md5值,
result = sort+appkey
print(result)

# todo MD5加密,固定的写法
def jiami(params):
  m = hashlib.md5()
  m.update(params.encode("utf-8"))
  return m.hexdigest()

sign = jiami(result.lower())  #lower()把字符转为小写
print(sign)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python最长公共子串算法实例
Mar 07 Python
python中的闭包用法实例详解
May 05 Python
python实现比较两段文本不同之处的方法
May 30 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
django多文件上传,form提交,多对多外键保存的实例
Aug 06 Python
如何运行带参数的python脚本
Nov 15 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
Python爬虫使用代理IP的实现
Oct 27 #Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 #Python
Python搭建代理IP池实现检测IP的方法
Oct 27 #Python
浅析使用Python搭建http服务器
Oct 27 #Python
Python搭建代理IP池实现存储IP的方法
Oct 27 #Python
Python搭建代理IP池实现获取IP的方法
Oct 27 #Python
详解python statistics模块及函数用法
Oct 27 #Python
You might like
用PHP和ACCESS写聊天室(八)
2006/10/09 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
深入理解Node.js的HTTP模块
2016/10/12 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
JavaScript多态与封装实例分析
2018/07/27 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
js实现随机点名
2021/01/19 Javascript
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
Python连接PostgreSQL数据库的方法
2016/11/28 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
python解析xml简单示例
2019/06/21 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
自考生自我评价分享
2014/01/18 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
就业协议书怎么填
2014/04/11 职场文书
促销活动总结报告
2014/04/26 职场文书
留学推荐信怎么写
2015/03/26 职场文书
Python中递归以及递归遍历目录详解
2021/10/24 Python