Python实现Token生成与验证:基于HMAC-SHA1与Base64编码
本文介绍在Python中利用HMAC-SHA1算法生成Token及验证Token的方法。通过结合用户Key与过期时间戳,经Base64编码生成Token。验证时解码并比对摘要,确保Token未过期且未被篡改,适用于微信网页授权等防跨站攻击场景。
1、前言
近期在进行微信公众号开发时,涉及网页授权环节。微信要求开发者在授权URL中携带类似token的state参数,以此防范跨站请求伪造攻击。
经过深入考量,笔者尝试实现一套完整的Token生成与验证方案。下文将展示相关代码,恳请读者批评指正。
2、产生Token
原理:
利用HMAC-SHA1算法,对用户提供的Key与Token的最大过期时间戳计算消息摘要。将该摘要与最大过期时间戳以冒号“:”拼接,随后进行Base64编码,从而生成最终的Token字符串。
实现:
import time
import base64
import hmac
def generate_token(key, expire=3600):
r'''
@Args:
key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)
expire: int(最大有效时间,单位为s)
@Return:
state: str
'''
ts_str = str(time.time() + expire)
ts_byte = ts_str.encode("utf-8")
sha1_tshexstr = hmac.new(key.encode("utf-8"),ts_byte,'sha1').hexdigest()
token = ts_str+':'+sha1_tshexstr
b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
return b64_token.decode("utf-8")
3、验证Token
原理:
首先对Token进行Base64解码,从中提取Token的最大过期时间戳及消息摘要。随后检查Token是否已过期。
若Token未过期,则使用与生成Token时相同的Key,对提取出的最大过期时间戳再次执行HMAC-SHA1算法运算。最后,将计算得出的摘要与从Token中解析出的消息摘要进行比对。若两者一致,则判定Token有效;否则判定为无效。
实现:
import time
import base64
import hmac
def certify_token(key, token):
r'''
@Args:
key: str
token: str
@Returns:
boolean
'''
token_str = base64.urlsafe_b64decode(state).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():
# token expired
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:
# token certification failed
return False
# token certification success
return True
4、用法
key = "JD98Dskw=23njQndW9D" # 一小时后过期 token = generate_token(key, 3600) certify_token(key, token)
5、Note!!!
本代码仅支持在Python 3.x版本环境中运行。
以上关于Python生成Token及验证Token的方法即为本文分享的全部内容,希望能对读者有所启发。欢迎大家参考使用,并期待各位的支持与反馈。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













