FLASK--token的生成与解析-base64原理

base64揭秘原理

1, 将字符串拆成每三个字符一组
2,计算每一个字符对应的ASCII码二进制
3,将8位的二进制码,按照每6位一组重新分组,不足6位的在后面补0 ,补足6位
4,计算对应的十进制编码
5,按照base64表,查看对应的字符
6,每三个字符一组,不够一组的,用24对重新分组后位数取余

原始字符->ASCII编码二进制->重新分组->ASCII编码十进制->base64索引值(十进制)->对应baser64值

1、单个字符后面有2个等号
2、两个字符后面有1个等号
3、三个字符一组没等号

ASCII对照表:http://ascii.911cha.com/
Base64编码对照表:https://www.cnblogs.com/rumenz/articles/15340777.html
在这里插入图片描述


import time
import base64
import hmac


# 解析token
def __certify_token(key, token):
    """
    解析token
    @Args:
        key: str
        token: str
    @Returns:
        boolean
    :param key:
    :param token:
    :return:
    """
    token_str = base64.urlsafe_b64decode(token).decode('utf-8')
    token_list = token_str.split(':')
    if len(token_list) != 2:
        return False
    ts_str = token_list[0]
    if float(ts_str) < time.time():
        return False
    known_sha1_tsstr = token_list[1]
    sha1 = hmac.new(key.encode("utf-8"), ts_str.encode('utf-8'), 'sha1')
    calc_sha1_tsstr = sha1.hexdigest()
    if calc_sha1_tsstr != known_sha1_tsstr:
        return False
    return True


# 生成token
def __generate_token(key, expire=3600):
    """
    @Args:
        key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)
        expire: int(最大有效时间,单位为s)
    @Return:
        state: str
    :param key:
    :param expire:
    :return:
    """
    ts_str = str(time.time() + expire)
    ts_byte = ts_str.encode("utf-8")
    sha1_tshex_str = hmac.new(key.encode("utf-8"), ts_byte, 'sha1').hexdigest()
    token = ts_str + ':' + sha1_tshex_str
    b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))

    return b64_token.decode("utf-8")

猜你喜欢

转载自blog.csdn.net/zhouzongxin94/article/details/120711798