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正则表达式匹配HTML页面编码
Apr 08 Python
Python中使用platform模块获取系统信息的用法教程
Jul 08 Python
Python实现的简单模板引擎功能示例
Sep 02 Python
matplotlib作图添加表格实例代码
Jan 23 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
python连接mongodb密码认证实例
Oct 16 Python
python实现移位加密和解密
Mar 22 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
解决Python3下map函数的显示问题
Dec 04 Python
使用tensorflow显示pb模型的所有网络结点方式
Jan 23 Python
python 进程池pool使用详解
Oct 15 Python
python3爬虫中多线程的优势总结
Nov 24 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中的float类型使用说明
2010/07/27 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
深入分析PHP引用(&amp;)
2014/09/04 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
python中的函数用法入门教程
2014/09/02 Python
Python通过select实现异步IO的方法
2015/06/04 Python
python图片验证码生成代码
2016/07/02 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
pytest中文文档之编写断言
2019/09/12 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
绘画设计学生的个人自我评价
2013/09/20 职场文书
专升本个人自我评价
2013/12/22 职场文书
小学教师事迹材料
2014/01/13 职场文书
会计学自荐信
2014/06/03 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers