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 ...
随机推荐
- Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置(转)
用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...
- 从入门到精通djang Django
http://docs.30c.org/djangobook2/ 推荐大家一本书 特别用用 中文版的 哦
- python中pandas库中DataFrame对行和列的操作使用方法
用pandas中的DataFrame时选取行或列: import numpy as np import pandas as pd from pandas import Sereis, DataFram ...
- leetcode解题报告(8):Remove Element
描述 Given an array and a value, remove all instances of that value in place and return the new length ...
- 在Ubuntu上安装openResty #1
在Ubuntu上安装openResty #1 OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方 ...
- nginx初步学习
今天想学习了解下nginx,找找视频,感觉不适合新手,然后来看阮一峰老师的博客 nginx容器教程:http://www.ruanyifeng.com/blog/2018/02/nginx-docke ...
- 【Robot Framework 项目实战 03】使用脚本自动生成统一格式的RF自动化用例
背景 虽然大家都已经使用了统一的关键字,但是在检查了一些测试用例之后,还是发现因为大家对RF的熟悉程度不一导致的测试用例颗粒度差异很大的情况:而且在手动方式转化测试用例过程中,有不少工作是完全重复的且 ...
- vue 中引入第三方js库
以 jQuery 为例 一.绝对路径直接引入,全局可用 主入口页面 index.html 中用 script 标签引入: <script src="./static/jquery-1. ...
- shell cat 用法
cat命令的用途是连接文件或标准输入并打印. 1.命令格式:cat [选项] [文件]... 2.命令功能:cat主要有三大功能:1.一次显示整个文件:cat filename --常用来显示文件 ...
- java基于jcifs.smb实现远程发送文件到服务器
1.服务器指定共享文件夹 1.1.验证服务器共享文件夹本地可以访问: 2.导入依赖的相关jar包 jcifs-1.3.**.jar: <dependency> <gr ...