Python用摘要算法生成token及检验token的示例代码
#基础版,不依赖环境
importtime
importbase64
importhashlib
classToken_hander():
def__init__(self,out_time):
self.out_time=out_time
self.time=self.timer
pass
deftimer(self):
returntime.time()
defhax(self,str):
"""
摘要算法加密
:paramstr:待加密字符串
:return:加密后的字符串
"""
ifnotisinstance(str,bytes):#如果传入不是bytes类型,则转为bytes类型
try:
str=bytes(str,encoding="utf8")
exceptBaseExceptionasex:
raiseValueError("'%s'不可被转换为bytes类型"%str)
md5=hashlib.md5()
md5.update("天王盖地虎erafe23".encode(encoding='utf-8'))
md5.update(str)
md5.update("992ksd上山打老虎da".encode(encoding='utf-8'))
returnmd5.hexdigest()
defbuild_token(self,message):
"""
hax_message:待加密字符串内容格式:'当前时间戳:message:过期时间戳'
:parammessage:需要生成token的字符串
:paramtime:过期时间
: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'))
returntoken.decode("utf-8")
defcheck_token(self,token):
"""
:paramtoken:待检验的token
:return:Falseornewtoken
"""
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)
ifmd5!=self.hax(message):
#加密内容如果与加密后的结果不符即token不合法
returnFalse
else:
ifself.time()-float(message_list.pop(-1))>0:
#超时返回False
returnFalse
else:
#token验证成功返回新的token
returnself.build_token(message_list.pop(-1))
exceptBaseExceptionasex:
#有异常表明验证失败或者传入参数不合法
returnFalse
#测试
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=时间,以秒为单位
importos
importtime
importbase64
importhashlib
importimportlib
ENVIRONMENT_VARIABLE="DJANGO_SETTINGS_MODULE"
classToken_hander():
def__init__(self):
self.out_time=self.getOutTime()
self.time=self.timer
pass
deftimer(self):
returntime.time()
defgetOutTime(self):
module=importlib.import_module(os.environ.get(ENVIRONMENT_VARIABLE))
returngetattr(module,"OUT_TIME",60)#在settings配置文件中找OUT_TIME变量,如果没有,默认60秒
defhax(self,str):
"""
摘要算法加密
:paramstr:待加密字符串
:return:加密后的字符串
"""
ifnotisinstance(str,bytes):#如果传入不是bytes类型,则转为bytes类型
try:
str=bytes(str,encoding="utf8")
exceptBaseExceptionasex:
raiseValueError("'%s'不可被转换为bytes类型"%str)
md5=hashlib.md5()
md5.update("天王盖地虎erafe23".encode(encoding='utf-8'))
md5.update(str)
md5.update("992ksd上山打老虎da".encode(encoding='utf-8'))
returnmd5.hexdigest()
defbuild_token(self,message):
"""
hax_message:待加密字符串内容格式:'当前时间戳:message:过期时间戳'
:parammessage:需要生成token的字符串
:paramtime:过期时间
: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'))
returntoken.decode("utf-8")
defcheck_token(self,token):
"""
:paramtoken:待检验的token
:return:Falseornewtoken
"""
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)
ifmd5!=self.hax(message):
#加密内容如果与加密后的结果不符即token不合法
returnFalse
else:
ifself.time()-float(message_list.pop(-1))>0:
#超时返回False
returnFalse
else:
#token验证成功返回新的token
returnself.build_token(message_list.pop(-1))
exceptBaseExceptionasex:
#有异常表明验证失败或者传入参数不合法
returnFalse
#封装成Django模块,也依赖Django运行环境
#需要在settings配置文件中配置OUT_TIME=时间,秒为单位
importtime
importbase64
importhashlib
fromdjango.confimportsettings
classToken_hander():
def__init__(self):
self.out_time=self.getOutTime()
self.time=self.timer
pass
deftimer(self):
returntime.time()
defgetOutTime(self):
try:
returnsettings.__getattr__("OUT_time")#在导入的settings中找OUT_TIME变量
exceptBaseException:
return60#找不到默认60也可以设置直接抛异常
defhax(self,str):
"""
摘要算法加密
:paramstr:待加密字符串
:return:加密后的字符串
"""
ifnotisinstance(str,bytes):#如果传入不是bytes类型,则转为bytes类型
try:
str=bytes(str,encoding="utf8")
exceptBaseExceptionasex:
raiseValueError("'%s'不可被转换为bytes类型"%str)
md5=hashlib.md5()
md5.update("天王盖地虎erafe23".encode(encoding='utf-8'))
md5.update(str)
md5.update("992ksd上山打老虎da".encode(encoding='utf-8'))
returnmd5.hexdigest()
defbuild_token(self,message):
"""
hax_message:待加密字符串内容格式:'当前时间戳:message:过期时间戳'
:parammessage:需要生成token的字符串
:paramtime:过期时间
: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'))
returntoken.decode("utf-8")
defcheck_token(self,token):
"""
:paramtoken:待检验的token
:return:Falseornewtoken
"""
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)
ifmd5!=self.hax(message):
#加密内容如果与加密后的结果不符即token不合法
returnFalse
else:
ifself.time()-float(message_list.pop(-1))>0:
#超时返回False
returnFalse
else:
#token验证成功返回新的token
returnself.build_token(message_list.pop(-1))
exceptBaseExceptionasex:
#有异常表明验证失败或者传入参数不合法
returnFalse
以上就是Python用摘要算法生成token及检验token的示例代码的详细内容,更多关于Python用摘要算法生成token的资料请关注毛票票其它相关文章!