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")