Python用摘要算法生成token及检验token
# 基础版,不依赖环境 import time
import base64
import hashlib
class Token_hander():
def __init__(self,out_time):
self.out_time = out_time
self.time = self.timer
pass
def timer(self):
return time.time() def hax(self,str):
"""
摘要算法加密
:param str: 待加密字符串
:return: 加密后的字符串
"""
if not isinstance(str,bytes): # 如果传入不是bytes类型,则转为bytes类型
try:
str = bytes(str,encoding="utf8")
except BaseException as ex:
raise ValueError("'%s'不可被转换为bytes类型"%str) md5 = hashlib.md5()
md5.update("天王盖地虎erafe23".encode(encoding='utf-8'))
md5.update(str)
md5.update("992ksd上山打老虎da".encode(encoding='utf-8'))
return md5.hexdigest() def build_token(self,message):
"""
hax_message: 待加密字符串内容 格式: '当前时间戳:message:过期时间戳'
:param message: 需要生成token的字符串
:param time: 过期时间
:return: token
"""
hax_message = "%s:%s:%s"%(str(self.time()),message,
str(float(self.time())+float(self.out_time)))
hax_res = self.hax(hax_message)
token = base64.urlsafe_b64encode(("%s:%s"%(hax_message,hax_res)).encode(encoding='utf-8'))
return token.decode("utf-8") def check_token(self,token):
""" :param token: 待检验的token
:return: False or new token
"""
try:
hax_res = base64.urlsafe_b64decode(token.encode("utf8")).decode("utf-8")
message_list = hax_res.split(":")
md5 = message_list.pop(-1)
message = ':'.join(message_list)
if md5 != self.hax(message):
# 加密内容如果与加密后的结果不符即token不合法
return False
else:
if self.time() - float(message_list.pop(-1)) >0:
# 超时返回False
return False
else:
# token验证成功返回新的token
return self.build_token(message_list.pop(-1))
except BaseException as ex:
# 有异常表明验证失败或者传入参数不合法
return False # 测试
if __name__ == '__main__':
token_hand = Token_hander(5)
token = token_hand.build_token(b'dxxx')
print(token_hand.check_token(token))
time.sleep(5)
print(token_hand.check_token(token))
# 封装成Django源码版
# 依赖Django运行环境,不可单独测试,需运行Django环境,
# 需要在settings配置文件中配置 OUT_TIME = 时间 ,以秒为单位 import os
import time
import base64
import hashlib
import importlib
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE" class Token_hander():
def __init__(self):
self.out_time = self.getOutTime()
self.time = self.timer pass
def timer(self):
return time.time() def getOutTime(self):
module = importlib.import_module(os.environ.get(ENVIRONMENT_VARIABLE))
return getattr(module, "OUT_TIME",60) # 在settings配置文件中找 OUT_TIME 变量,如果没有,默认60秒 def hax(self,str):
"""
摘要算法加密
:param str: 待加密字符串
:return: 加密后的字符串
"""
if not isinstance(str,bytes): # 如果传入不是bytes类型,则转为bytes类型
try:
str = bytes(str,encoding="utf8")
except BaseException as ex:
raise ValueError("'%s'不可被转换为bytes类型"%str) md5 = hashlib.md5()
md5.update("天王盖地虎erafe23".encode(encoding='utf-8'))
md5.update(str)
md5.update("992ksd上山打老虎da".encode(encoding='utf-8'))
return md5.hexdigest() def build_token(self,message):
"""
hax_message: 待加密字符串内容 格式: '当前时间戳:message:过期时间戳'
:param message: 需要生成token的字符串
:param time: 过期时间
:return: token
"""
hax_message = "%s:%s:%s"%(str(self.time()),message,
str(float(self.time())+float(self.out_time)))
hax_res = self.hax(hax_message)
token = base64.urlsafe_b64encode(("%s:%s"%(hax_message,hax_res)).encode(encoding='utf-8'))
return token.decode("utf-8") def check_token(self,token):
""" :param token: 待检验的token
:return: False or new token
"""
try:
hax_res = base64.urlsafe_b64decode(token.encode("utf8")).decode("utf-8")
message_list = hax_res.split(":")
md5 = message_list.pop(-1)
message = ':'.join(message_list)
if md5 != self.hax(message):
# 加密内容如果与加密后的结果不符即token不合法
return False
else:
if self.time() - float(message_list.pop(-1)) >0:
# 超时返回False
return False
else:
# token验证成功返回新的token
return self.build_token(message_list.pop(-1))
except BaseException as ex:
# 有异常表明验证失败或者传入参数不合法
return False
# 封装成Django模块,也依赖Django运行环境
# 需要在settings配置文件中配置 OUT_TIME = 时间 , 秒为单位 import time
import base64
import hashlib
from django.conf import settings class Token_hander():
def __init__(self):
self.out_time = self.getOutTime()
self.time = self.timer pass
def timer(self):
return time.time() def getOutTime(self):
try:
return settings.__getattr__("OUT_time") # 在导入的settings中找 OUT_TIME 变量
except BaseException:
return 60 # 找不到默认60 也可以设置直接抛异常 def hax(self,str):
"""
摘要算法加密
:param str: 待加密字符串
:return: 加密后的字符串
"""
if not isinstance(str,bytes): # 如果传入不是bytes类型,则转为bytes类型
try:
str = bytes(str,encoding="utf8")
except BaseException as ex:
raise ValueError("'%s'不可被转换为bytes类型"%str) md5 = hashlib.md5()
md5.update("天王盖地虎erafe23".encode(encoding='utf-8'))
md5.update(str)
md5.update("992ksd上山打老虎da".encode(encoding='utf-8'))
return md5.hexdigest() def build_token(self,message):
"""
hax_message: 待加密字符串内容 格式: '当前时间戳:message:过期时间戳'
:param message: 需要生成token的字符串
:param time: 过期时间
:return: token
"""
hax_message = "%s:%s:%s"%(str(self.time()),message,
str(float(self.time())+float(self.out_time)))
hax_res = self.hax(hax_message)
token = base64.urlsafe_b64encode(("%s:%s"%(hax_message,hax_res)).encode(encoding='utf-8'))
return token.decode("utf-8") def check_token(self,token):
""" :param token: 待检验的token
:return: False or new token
"""
try:
hax_res = base64.urlsafe_b64decode(token.encode("utf8")).decode("utf-8")
message_list = hax_res.split(":")
md5 = message_list.pop(-1)
message = ':'.join(message_list)
if md5 != self.hax(message):
# 加密内容如果与加密后的结果不符即token不合法
return False
else:
if self.time() - float(message_list.pop(-1)) >0:
# 超时返回False
return False
else:
# token验证成功返回新的token
return self.build_token(message_list.pop(-1))
except BaseException as ex:
# 有异常表明验证失败或者传入参数不合法
return False
Python用摘要算法生成token及检验token的更多相关文章
- python 数据加密以及生成token和token验证
代码如下: # -*- coding: utf-8 -*- from passlib.apps import custom_app_context as pwd_context import conf ...
- python中生成JWK(json web token)
#需要安装pyjwt import jwt import time # 使用 sanic 作为restful api 框架 def create_token(request): grant_type ...
- 生成token和获取token
1.先安装模块pip install itsdangerous 举个例子:一个用户登录成功后,讲username和token作为key,value写到redis里面,判断是否失效(1.时间到了失效,2 ...
- python接口自动化(二十)--token登录(详解)
简介 为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮.有些登录不是用 cookie 来验证的,是用 token 参数来判断是否登录.token 传参有两种一种是放在请 ...
- 关于 IdentityServer4 中的 Jwt Token 与 Reference Token
OpenID Connect(Core),OAuth 2.0(RFC 6749),JSON Web Token (JWT)(RFC 7519) 之间有着密不可分联系,对比了不同语言的实现,还是觉得 I ...
- Python 实现 JWT 生成
Python 实现 JWT 生成 JWT 简介:https://www.jianshu.com/p/576dbf44b2ae Json web token (JWT), 是为了在网络应用环境间传递声明 ...
- python实现树莓派生成并识别二维码
python实现树莓派生成并识别二维码 参考来源:http://blog.csdn.net/Burgess_Liu/article/details/40397803 设备及环境 树莓派2代 官方系统R ...
- python脚本批量生成数据
在平时的工作中,经常会遇到造数据,特别是性能测试的时候更是需要大量的数据.如果一条条的插入数据库或者一条条的创建数据,效率未免有点低.如何快速的造大量的测试数据呢?在不熟悉存储过程的情况下,今天给大家 ...
- 关于token和refresh token
最近在做公司的认证系统,总结了如下一番心得. 传统的认证方式一般采用cookie/session来实现,这是我们的出发点. 1.为什么选用token而不选用cookie/session? 本质上tok ...
随机推荐
- python的logging日志模块(一)
最近修改了项目里的logging相关功能,用到了Python标准库里的logging模块,在此做一些记录.主要是从官方文档和stackoverflow上查询到的一些内容. 官方文档 技术博客 基本用法 ...
- 出现错误时返回异常 MVC
在使用MVC的时候,会出现异常提醒: 1,当在Controller出现错误的时候,我们可以直接返回,即return view()返回视图. ViewBag.Msg("产品或赠品不存在&qu ...
- 022_STM32中断优先级分组解析
(0)STM32有十六个优先级 (一)STM32分组为:组0-4 (二)分组配置在寄存器SCB->AIRCR中: (三)解析第二点 1. 组0就是4位都用来设置成响应优先级,2^4=16位都是响 ...
- 全选所有checkbox
$("table input[type=checkbox]").attr("checked",true)
- Laravel API Errors and Exceptions: How to Return Responses
Laravel API Errors and Exceptions: How to Return Responses February 13, 2019 API-based projects are ...
- python 关键参数和默认值
def hello_key(greeting='hello', name='world'): print('%s, %s' % (greeting, name)) hello_key() hello_ ...
- F. Make Them Similar ( 暴力折半枚举 + 小技巧 )
传送门 题意: 给你 n 个数 a[ 1 ] ~ a[ n ], n <= 100: 让你找一个 x , 使得 a[ 1 ] = a[ 1 ] ^ x ~ a[ n ] = a[ n ] ^ ...
- webpack项目怎样修改package项目名称
使用vue-cli+webpack创建的项目,修改文件名称或者更改文件的位置,运营时会报错,是因为npm项目,在安装依赖(node_nodules)时,会记录当前的文件路径,当修改之后就无法正常启动. ...
- 51nod 1060
反素数定义:对于任意正整数 $n$, 其约数个数记为 $f(n)$, 如果某个正整数 $n$ 满足 对于任意正整数 $i, (0 < i < n)$, 都有 $f(i) < f(n) ...
- P5149 会议座位
P5149 会议座位 题意: 其实还是求逆序对数. 解法: 用离散化统计每个数,再用树状数组求逆序对. CODE: #include<iostream> #include<cstdi ...