Python用摘要算法生成token及检验token的示例代码


Posted in Python onDecember 01, 2020
# 基础版,不依赖环境

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的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python遍历数组的方法小结
Apr 30 Python
python3.5基于TCP实现文件传输
Mar 20 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
Python FFT合成波形的实例
Dec 04 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
Jan 25 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
PyTorch device与cuda.device用法
Apr 03 Python
python录音并调用百度语音识别接口的示例
Dec 01 #Python
用python爬虫批量下载pdf的实现
Dec 01 #Python
python3字符串输出常见面试题总结
Dec 01 #Python
python3中数组逆序输出方法
Dec 01 #Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 #Python
python爬虫请求头的使用
Dec 01 #Python
在pycharm创建scrapy项目的实现步骤
Dec 01 #Python
You might like
php日历[测试通过]
2008/03/27 PHP
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
使用js修改客户端注册表的方法
2013/08/09 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
pyqt5简介及安装方法介绍
2018/01/31 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
python 8种必备的gui库
2020/08/27 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
Python中生成ndarray实例讲解
2021/02/22 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
详解CSS3中@media的实际使用
2015/08/04 HTML / CSS
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
体育教师工作总结的自我评价
2013/10/10 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
男方家长婚礼致辞
2015/07/27 职场文书
Python使用openpyxl批量处理数据
2021/06/23 Python