python 产生token及token验证的方法


Posted in Python onDecember 26, 2018

1、前言

最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击。

在经过再三思考之后,自己试着实现一个产生token和验证token的方案。接下就把code贴出来。希望读者指导一下。

2、产生token

原理:

通过hmac sha1 算法产生用户给定的key和token的最大过期时间戳的一个消息摘要,将这个消息摘要和最大过期时间戳通过":"拼接起来,再进行base64编码,生成最终的token

实现:

import time
import base64
import hmac

def generate_token(key, expire=3600):
 r'''
 @Args:
  key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)
  expire: int(最大有效时间,单位为s)
 @Return:
  state: str
 '''
 ts_str = str(time.time() + expire)
 ts_byte = ts_str.encode("utf-8")
 sha1_tshexstr = hmac.new(key.encode("utf-8"),ts_byte,'sha1').hexdigest() 
 token = ts_str+':'+sha1_tshexstr
 b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
 return b64_token.decode("utf-8")

3、验证token

原理:

将token进行base64解码,通过token得到token最大过期时间戳和消息摘要。判断token是否过期。

如没过期才将 从token中的取得最大过期时间戳进行hmac sha1 算法运算(注意这里的key要与产生token的key要相同),最后将产生的摘要与通过token取得消息摘要进行对比, 如果两个摘要相等,则token有效,否则token无效 。

实现:

import time
import base64
import hmac

def certify_token(key, token):
 r'''
 @Args:
  key: str
  token: str
 @Returns:
  boolean
 '''
 token_str = base64.urlsafe_b64decode(state).decode('utf-8')
 token_list = token_str.split(':')
 if len(token_list) != 2:
 return False
 ts_str = token_list[0]
 if float(ts_str) < time.time():
 # token expired
 return False
 known_sha1_tsstr = token_list[1]
 sha1 = hmac.new(key.encode("utf-8"),ts_str.encode('utf-8'),'sha1')
 calc_sha1_tsstr = sha1.hexdigest()
 if calc_sha1_tsstr != known_sha1_tsstr:
 # token certification failed
 return False 
 # token certification success
 return True

4、用法

key = "JD98Dskw=23njQndW9D"
# 一小时后过期
token = generate_token(key, 3600)

certify_token(key, token)

5、Note!!!

本代码只能在python3.x 中运行。

以上这篇python 产生token及token验证的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之对象和类的实际运用
Aug 29 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
Python 字典与字符串的互转实例
Jan 13 Python
关于Python 3中print函数的换行详解
Aug 08 Python
Python实现图片转字符画的示例
Aug 22 Python
python+selenium+autoit实现文件上传功能
Aug 23 Python
Python中使用支持向量机(SVM)算法
Dec 26 Python
python实现控制COM口的示例
Jul 03 Python
python实现简单成绩录入系统
Sep 19 Python
python:目标检测模型预测准确度计算方式(基于IoU)
Jan 18 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
对python捕获ctrl+c手工中断程序的两种方法详解
Dec 26 #Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 #Python
python处理multipart/form-data的请求方法
Dec 26 #Python
Python实现的简单线性回归算法实例分析
Dec 26 #Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 #Python
python使用knn实现特征向量分类
Dec 26 #Python
python调用staf自动化框架的方法
Dec 26 #Python
You might like
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
js DOM模型操作
2009/12/28 Javascript
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
Python MD5文件生成码
2009/01/12 Python
Python的Django中django-userena组件的简单使用教程
2015/05/30 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
零基础小白多久能学会python
2020/06/22 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
幼儿园园长安全责任书
2015/05/08 职场文书
债务追讨律师函
2015/06/24 职场文书
庆祝教师节主持词
2015/07/06 职场文书
教你怎么用python实现字符串转日期
2021/05/24 Python