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