Python实现Token生成与验证:基于HMAC-SHA1与Base64编码

洛溪
洛溪
发布时间:2026-10-13| 7人浏览过
原创

本文介绍在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的方法即为本文分享的全部内容,希望能对读者有所启发。欢迎大家参考使用,并期待各位的支持与反馈。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。