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

 更新时间:2020年12月01日 15:37:37   作者:希希大队长  
这篇文章主要介绍了Python用摘要算法生成token及检验token的示例代码,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
# 基础版,不依赖环境

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的资料请关注脚本之家其它相关文章!

相关文章

  • pytorch 把MNIST数据集转换成图片和txt的方法

    pytorch 把MNIST数据集转换成图片和txt的方法

    这篇文章主要介绍了pytorch 把MNIST数据集转换成图片和txt的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Python模拟登陆实现代码

    Python模拟登陆实现代码

    本篇文章主要介绍了Python模拟登陆实现代码,这里整理了详细的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Python根据已知邻接矩阵绘制无向图操作示例

    Python根据已知邻接矩阵绘制无向图操作示例

    这篇文章主要介绍了Python根据已知邻接矩阵绘制无向图操作,涉及Python使用networkx、matplotlib进行数值运算与图形绘制相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • 使用python实现名片管理系统

    使用python实现名片管理系统

    这篇文章主要为大家详细介绍了使用python实现名片管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 关于SSD目标检测模型的人脸口罩识别

    关于SSD目标检测模型的人脸口罩识别

    这篇文章主要介绍了关于SSD目标检测模型的人脸口罩识别问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Python 3 实现定义跨模块的全局变量和使用教程

    Python 3 实现定义跨模块的全局变量和使用教程

    这篇文章主要介绍了Python 3 实现定义跨模块的全局变量和使用,本文通过实例代码相结合的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Windows10+anacond+GPU+pytorch安装详细过程

    Windows10+anacond+GPU+pytorch安装详细过程

    这篇文章主要介绍了Windows10+anacond+GPU+pytorch安装详细过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Python中operator模块的操作符使用示例总结

    Python中operator模块的操作符使用示例总结

    operator模块中包含了Python的各种内置操作符,诸如逻辑、比较、计算等,这里我们针对一些常用的操作符来作一个Python中operator模块的操作符使用示例总结:
    2016-06-06
  • Windows系统下安装tensorflow的配置步骤

    Windows系统下安装tensorflow的配置步骤

    这篇文章主要介绍了Windows系统下安装tensorflow,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Python使用matplotlib绘制Logistic曲线操作示例

    Python使用matplotlib绘制Logistic曲线操作示例

    这篇文章主要介绍了Python使用matplotlib绘制Logistic曲线操作,结合实例形式详细分析了Python基于matplotlib库绘制Logistic曲线相关步骤与实现技巧,需要的朋友可以参考下
    2019-11-11

最新评论