Python用摘要算法生成token及检验token的示例代码
作者:希希大队长 时间:2022-05-30 10:22:10
# 基础版,不依赖环境
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
标签:Python,摘要算法,token
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
“您无权查看该网页”的原因和解决方法
2008-03-24 16:57:00
详解python--模拟轮盘抽奖游戏
2023-07-25 15:35:14
![](https://img.aspxhome.com/file/2023/5/71395_0s.png)
MySQL手动安装方法与中文解决方案
2011-04-25 18:21:00
Python+logging输出到屏幕将log日志写入文件
2023-07-19 05:29:21
![](https://img.aspxhome.com/file/2023/5/59295_0s.png)
Python实现删除重复文件的示例代码
2022-02-26 03:50:22
Python实现完全数的示例详解
2021-11-21 20:09:30
python如何快速生成时间戳
2022-10-26 08:15:41
django ajax发送post请求的两种方法
2022-06-21 07:06:51
解决json中ensure_ascii=False的问题
2023-01-04 10:49:11
BootStrap表单控件之复选框checkbox和单选择按钮radio
2023-08-20 09:36:22
![](https://img.aspxhome.com/file/2023/9/56039_0s.png)
Python实现的金山快盘的签到程序
2022-12-05 21:14:51
用CSS实现柱状图(Bar Graph)的方法(三)——复杂柱状图的实现
2008-05-26 13:36:00
![](https://img.aspxhome.com/file/UploadPic/20085/26/2008526134946841s.jpg)
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2023-09-11 15:11:50
深入了解Golang中Slice切片的使用
2023-09-25 08:59:08
![](https://img.aspxhome.com/file/2023/9/87609_0s.png)
详解python列表生成式和列表生成式器区别
2021-09-13 16:15:14
提升你设计水平的CSS3新技术[译]
2009-08-02 20:51:00
![](https://img.aspxhome.com/file/UploadPic/up/2009080221214142.gif)
在ASP与ASP.NET之间共享对话状态(1)
2008-09-02 12:18:00
PyQt5的相对布局管理的实现
2022-02-23 08:11:18
![](https://img.aspxhome.com/file/2023/9/86199_0s.png)
Python实现基于权重的随机数2种方法
2022-10-13 03:25:40
利用XSLT把ADO记录集转换成XML
2008-09-05 17:12:00