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 26 Python
python 全文检索引擎详解
Apr 25 Python
python中defaultdict的用法详解
Jun 07 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
Linux下多个Python版本安装教程
Aug 15 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
Python实现图像的垂直投影示例
Jan 17 Python
python实现低通滤波器代码
Feb 26 Python
python matplotlib包图像配色方案分享
Mar 14 Python
PyTorch安装与基本使用详解
Aug 31 Python
Django实现聊天机器人
May 31 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
第八节 访问方式 [8]
2006/10/09 PHP
十天学会php之第一天
2006/10/09 PHP
如何写php程序?
2006/12/08 PHP
php session应用实例 登录验证
2009/03/16 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
JQuery从头学起第一讲
2010/07/04 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
python flask实现分页的示例代码
2018/08/02 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
python使用opencv resize图像不进行插值的操作
2020/07/05 Python
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
学习型班组申报材料
2014/05/31 职场文书
社区志愿者活动总结
2014/06/26 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书