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
相關文章
相關標籤/搜索