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 相关文章推荐
深入理解NumPy简明教程---数组1
Dec 17 Python
python中正则表达式的使用方法
Feb 25 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
Python分支语句与循环语句应用实例分析
May 07 Python
Python字符串的一些操作方法总结
Jun 10 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
Pytorch之contiguous的用法
Dec 31 Python
Tensorflow分批量读取数据教程
Feb 07 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
Python使用openpyxl复制整张sheet
Mar 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下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
PHP Include文件实例讲解
2019/02/15 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
JavaScript 学习笔记(五)
2009/12/31 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
2013/04/01 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
浅谈JS验证表单文本域输入空格的问题
2017/02/14 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
对Python3之方法的覆盖与super函数详解
2019/06/26 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
python源文件的字符编码知识点详解
2021/03/04 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
Linux如何为某个操作添加别名
2015/02/05 面试题
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
Python机器学习之底层实现KNN
2021/06/20 Python