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虚拟环境virualenv的安装与使用
Dec 18 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
python实现从wind导入数据
Dec 03 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
在Tensorflow中实现梯度下降法更新参数值
Jan 23 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
python urllib库的使用详解
Apr 13 Python
再谈python_tkinter弹出对话框创建
Mar 20 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实现图片旋转效果实例代码
2014/10/01 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
pymssql ntext字段调用问题解决方法
2008/12/17 Python
使用Python开发windows GUI程序入门实例
2014/10/23 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
Java面试笔试题大全
2016/11/23 面试题
历史专业个人求职信分享
2013/12/20 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
会议通知格式范文
2015/04/15 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
证婚人致辞精选
2015/07/28 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
python实现MD5进行文件去重的示例代码
2021/07/09 Python