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的资料请关注我们其它相关文章!

(0)

相关推荐

  • python+excel接口自动化获取token并作为请求参数进行传参操作

    1.登录接口登录后返回对应token封装: import json import requests from util.operation_json import OperationJson from base.runmethod import RunMethod class OperationHeader: def __init__(self, response): self.response = json.loads(response) def get_response_token(self

  • 如何基于python对接钉钉并获取access_token

    1.首先注册应用,获取 appkey.appsecret api_url = "https://oapi.dingtalk.com/gettoken?appkey=%s&appsecret=%s"%(appkey,appsecret) def get_token(): # try: res = requests.get(api_url) if res.status_code == 200: str_res = res.text token = (json.loads(str_r

  • Python hashlib常见摘要算法详解

    这篇文章主要介绍了Python hashlib常见摘要算法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等 计算出一个字符串的MD5值: import hashlib md5 = hashlib.md5() md5.update('how to use md5 in python hashlib?'.encode("utf8")) #需要指定转码 否则报错 u

  • Python中摘要算法MD5,SHA1简介及应用实例代码

    关于算法的学习,小编觉得编程语言中的算法大都有一些相通的地方,主要的方面一是了解这一算法能用来干什么,另一方面,学习它在这类编程语言中怎么实现. 摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示).摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过(不同的data计算出来的摘要不同). 常见的摘要算法有MD5和SHA1 MD5 import hashli

  • python基础教程之python消息摘要算法使用示例

    复制代码 代码如下: #! /usr/bin/python'''      File      : testHash.py      Author    : Mike'''import hashlibsrc = raw_input("Input string : ")funcNameList = ["MD5","SHA1","SHA224","SHA256","SHA384","

  • Python和GO语言实现的消息摘要算法示例

    常用的消息摘要算法有MD5和SHA,这些算法在python和go的库中都有,需要时候调用下就OK了,这里总结下python和go的实现. 一.python消息摘要示例 代码如下: 复制代码 代码如下: #! /usr/bin/python '''       File      : testHash.py       Author    : Mike       E-Mail    : Mike_Zhang@live.com ''' import hashlib src = raw_input(

  • python 产生token及token验证的方法

    1.前言 最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击. 在经过再三思考之后,自己试着实现一个产生token和验证token的方案.接下就把code贴出来.希望读者指导一下. 2.产生token 原理: 通过hmac sha1 算法产生用户给定的key和token的最大过期时间戳的一个消息摘要,将这个消息摘要和最大过期时间戳通过":"拼接起来,再进行base64编码,生成最终的token 实现: impo

  • 对python的unittest架构公共参数token提取方法详解

    额...每个请求都有token值的传入,但是token非常易变,一旦变化,所有的接口用例都得改一遍token,工作量太大了... 那么有没有一种方法能把token提取出来,作为一个全局变量,作为一个参数,从而牵一发而动全身呢?? 经过探索,具体方案如下 先定义一个全局变量token类型为string 然后把请求链接定义一个变量类型为string 然后定义第三个变量=前两个变量相加 然后requests直接传第三个变量就行了 具体代码如下: class Test(unittest.TestCase

  • 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: 待加密字符

  • SpringBoot整合token实现登录认证的示例代码

    1.pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</group

  • Python使用urlretrieve实现直接远程下载图片的示例代码

    在实现爬虫任务时,经常需要将一些图片下载到本地当中.那么在python中除了通过open()函数,以二进制写入方式来下载图片以外,还有什么其他方式吗?本文将使用urlretrieve实现直接远程下载图片. 下面我们再来看看 urllib 模块提供的 urlretrieve() 函数.urlretrieve() 方法直接将远程数据下载到本地. >>> help(urllib.urlretrieve) Help on function urlretrieve in module urllib

  • 基于Python编写简易版的天天跑酷游戏的示例代码

    写出来的效果图就是这样了: 下面就更新一下全部的代码吧 还是老样子先定义 import pygame,sys import random 写一下游戏配置 width = 1200            #窗口宽度 height = 508            #窗口高度 size = width, height    score=None              #分数 myFont=myFont1=None     #字体 surObject=None          #障碍物图片   

  • Python设置Word全局样式和文本样式的示例代码

    目录 全局样式的定义 文本样式的定义 上一章节我们学习了如何生成 word 文档以及在文档行中添加各种内容,今天我们基于上一章节的内容进行添砖加瓦 —> 对内容进行各种样式的设置,让其能够看起来更加的美观. 全局样式的定义 通过全局样式的设置,可以使得 word 全文都可以继承这样的样式效果: 使用方法: style = document_obj.styles['Normal'] 通过 Document 对象调用 styles 对象集,通过中括号的方式选择全局样式,获得 样式对象 . for s

  • python实现本地图片转存并重命名的示例代码

    //有1-22个文件夹,各文件夹下有Detect_0文件夹,此文件夹下有source与mask文件夹,目的是将需要获取图片的 文件夹下的图片复制到新的文件夹下并按顺序重命名 import os import shutil //删除之前文件夹并新建空文件夹 shutil.rmtree(r'E:\\all_project\\picture') os.makedirs("E:\\all_project\\picture\\source\\") os.makedirs("E:\\al

  • Python 实现毫秒级淘宝抢购脚本的示例代码

    本篇文章主要介绍了Python 通过selenium实现毫秒级自动抢购的示例代码,通过扫码登录即可自动完成一系列操作,抢购时间精确至毫秒,可抢加购物车等待时间结算的,也可以抢聚划算的商品. 博主不提供任何服务器端程序,也不提供任何收费抢购软件.该文章仅作为学习selenium框架的一个示例代码.该思路可运用到其他任何网站,京东,天猫,淘宝均可使用,且不属于外挂或者软件之类,只属于一个自动化点击工具,如有侵犯到任何公司的合法权益,会第一时间将相关代码给予删除. 直接上源码: # !/usr/bin

  • python读取word文档,插入mysql数据库的示例代码

    表格内容如下: 1.实现批量导入word文档,取文档标题中的数字作为编号 2.除取上面打钩的内容需要匹配出来入库入库,其他内容全部直接入库mysql # wuyanfeng # -*- coding:utf-8 -*- # 读取docx中的文本代码示例 import docx import pymysql import re import os # 创建数据库链接 conn = pymysql.connect( host='rm-bp1vu5d84dg12c6d59o.mysql.rds.ali

  • Python实现Word表格转成Excel表格的示例代码

    准备工作 pip install docx pip install openpyxl 具体代码 # 没有的先pip install 包名称 from docx import Document from openpyxl import Workbook document = Document('Docx文件路径.dicx') count = 0 tables = [] wb = Workbook() ws = wb.active # 设置列数,可以指定列名称,有几列就设置几个, # A对应列1,B

随机推荐