python3 token.py

"""
模块:python3 token.py
功能:python3 实现 token 的验证。
参考: https://blog.csdn.net/zhao_1109/article/details/84952969
https://www.cnblogs.com/yrxns/p/7727471.html
知识点:
1.加密算法
hmac.new(key, msg=None, digestmod=None)
    创建一个新的散列对象(hashing object)并返回它。

    key: 哈希的起始键。
    msg: 如果可用,将立即散列到(be hashed into)对象的起始状态。
    digestmod: 摘要(加密)模式,如SHA1、SHA224、SHA256、SHA384、SHA512、MD5等。

    现在,您可以使用它的 update() 方法将任意字符串输入到对象中,
    并且可以通过调用它的 digest() 方法在任何时候请求哈希值。

2.base64.urlsafe_b64encode(s)
    使用url和文件系统安全的base64字母表编码字节。

    参数s是一个用来编码的、类似字节的对象。
    结果作为字节对象返回。
    字母表使用'-'而不是 '+' , '_' 而不是'/'。

3.base64.urlsafe_b64decode(s)
    使用url和文件系统安全的base64字母表解码字节。

    参数s是一个类似字节的对象或要解码的ascii字符串。
    结果作为字节对象返回。
    如果输入的字节串被错误填充,则会引发binascii.Error。
    不在url-safe base-64字母表中的字符,而且不是加 '+' 或斜杠 '/',在填充检查之前将被丢弃。

    字母表使用 '-' 而不是 '+' , '_' 而不是 '/'。
"""

import time
import base64
import hmac


def generate_token(key, expire=3600):
    """
    功能:生成 token。
    :param key: 密钥。
    :param expire: 有效期,单位:秒。
    :return: token.
    """
    # print(time.time())
    ts_str = str(time.time() + expire)
    # print("ts_str:", ts_str)
    ts_byte = ts_str.encode("utf-8")
    print("ts_byte:", ts_byte)
    # ts_byte: b'1582777503.9325128'
    # 加密
    sha1_tshexstr = hmac.new(key.encode("utf-8"), ts_byte, 'sha1').hexdigest()
    print("sha1_tshexstr:", sha1_tshexstr)
    # sha1_tshexstr: 73603e97ef8e75cca3fdcfaa3a51270572f40772
    sha256_tshexstr = hmac.new(key.encode("utf-8"), ts_byte, 'SHA256').hexdigest()
    print("sha256_tshexstr:", sha256_tshexstr)
    # sha256_tshexstr: 49b04736bc33de9a99c6b0dc35b938c8ef5dbecc763cbefbbebe8333b1798697
    # help(base64.urlsafe_b64decode)
    token = ts_str + ':' + sha1_tshexstr
    b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
    return b64_token.decode("utf-8")


# 解密
def certify_token(key, token):
    token_str = base64.urlsafe_b64decode(token).decode('utf-8')
    token_list = token_str.split(':')
    if len(token_list) != 2:
        return 0
    ts_str = token_list[0]
    if float(ts_str) < time.time():
        # token expired
        return 0
    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:
        # token certification failed
        return 0
        # token certification success
        return 1


if __name__ == "__main__":
    generate_token("myStar", expire=3600)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值