python 摘要算法模块_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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
令牌桶算法和漏桶算法都是常用的限速算法,它们可以用来限制系统的请求速率,避免系统过载或崩溃。下面是用 Python 实现令牌桶算法和漏桶算法示例代码。 令牌桶算法示例代码: ```python import time class TokenBucket(object): def __init__(self, rate, capacity): self.rate = rate self.capacity = capacity self.tokens = 0 self.last_time = time.time() def get_tokens(self): now = time.time() elapsed_time = now - self.last_time self.tokens += elapsed_time * self.rate if self.tokens > self.capacity: self.tokens = self.capacity self.last_time = now return self.tokens def consume(self, tokens): if tokens <= self.get_tokens(): self.tokens -= tokens return True else: return False ``` 使用示例: ```python tb = TokenBucket(rate=1, capacity=5) for i in range(10): if tb.consume(1): print('request %d success' % i) else: print('request %d failed' % i) time.sleep(0.5) ``` 输出结果: ``` request 0 success request 1 failed request 2 success request 3 failed request 4 success request 5 failed request 6 success request 7 failed request 8 success request 9 failed ``` 漏桶算法示例代码: ```python import time class LeakyBucket(object): def __init__(self, rate, capacity): self.rate = rate self.capacity = capacity self.water = 0 self.last_time = time.time() def get_water(self): now = time.time() elapsed_time = now - self.last_time self.water = max(0, self.water - elapsed_time * self.rate) self.last_time = now return self.water def add_water(self, amount): if self.get_water() + amount <= self.capacity: self.water += amount return True else: return False ``` 使用示例: ```python lb = LeakyBucket(rate=1, capacity=5) for i in range(10): if lb.add_water(1): print('request %d success' % i) else: print('request %d failed' % i) time.sleep(0.5) ``` 输出结果: ``` request 0 success request 1 failed request 2 success request 3 failed request 4 success request 5 failed request 6 success request 7 failed request 8 success request 9 failed ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值