"""
模块: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)
python3 token.py
最新推荐文章于 2024-05-23 09:46:22 发布