Python用摘要算法生成token及检验token的示例代码
作者:希希大队长 发布时间:2022-05-30 10:22:10
标签:Python,摘要算法,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
来源:https://www.cnblogs.com/dongxixi/p/11139386.html
0
投稿
猜你喜欢
- easy_thumbnails:A powerful, yet easy to implement thumbnailing applica
- 这篇文章主要介绍了Python hashlib加密模块常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 在进行浮动布局时,大多数人都深知,在必要的地方进行浮动清理:<div style="clear:both;">
- 前言提到太阳系,大家可能会想到哥白尼和他的日心说,或是捍卫、发展日心说的斗士布鲁诺,他们像一缕光一样照亮了那个时代的夜空,对历史感兴趣的小伙
- 本文实例讲述了Python切片操作。分享给大家供大家参考,具体如下:在很多编程语言中,针对字符串提供了截取函数,其实目的就是对字符串切片。P
- MySQL数据库线程缓冲池的相关知识是本文我们主要要介绍的内容,MySQL数据库支持线程缓存,在多线程连接模式下,如果连接断开后,将这个线程
- 1、PHP 中如何正确统计中文字数?这个是困扰我很久的问题,PHP 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了
- 数据库连接:<% set conn=server.createobject("adodb.connection&q
- 删除字符串最后一个字符的方法1.使用strip()方法删除最后一个字符Python strip() 方法用于移除字符串头尾指定的字符(默认为
- 本文实例讲述了Python实现统计给定字符串中重复模式最高子串功能。分享给大家供大家参考,具体如下:给定一个字符串,如何得到其中重复模式最高
- 优化的思路一般是: 第一个是尽量降低向客户端同步对象的数量,第二个是尽量降低单个对象向客户端同步的数据."九宫格"是最常
- 本文实例讲述了php基于PDO实现功能强大的MYSQL封装类。分享给大家供大家参考,具体如下:class CPdo{ protected $
- 阅读Chapter 1 清单Chapter 2 标题总览:不但所有网页都需要有标题,而且如果标记正确的话,他们能为网页设计和易用性
- 开发web应用程序是一件非常辛苦的事情,你需要花大把大把的时间来做无数的事情。假如你不运用有条理的方法,尤其是在复杂的项目中,你会承受忽视项
- 1、简介AI 聊天机器人使用自然语言处理 (NLP) 来帮助用户通过文本、图形或语音与 Web 服务或应用进行交互。聊天机器人可以理解自然人
- 先写一个批处理文件,给个例子。 代码如下:set rq=%date:~0,10% exp system/system的
- QQ邮箱最新推出了一个授权码,需已验证的手机号向QQ邮箱服务器发送一条短信获得。该授权码用于第三方客户端登录,代替了第三方登录时使用的个人邮
- 上节我们介绍了表连接,更确切的说是inner joins內连接. 內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包
- 举例如下,一个服务器端的form 代码自动被解释成客户端代码:服务器端代码: &l
- 在Python中,json指的是符合json语法格式的字符串,可以单行或者多行。它可以方便的在使用在多种语言中,这里介绍的是在python中