如何利用Python的hmac模块实现API请求的数据完整性校验?

P粉602998670

P粉602998670

2026-07-11

193人浏览

原创

hmac.new() 的 key 和 msg 必须为 bytes 类型,需用 .encode("utf-8") 显式转换;生成签名须调用 .hexdigest() 得十六进制字符串;时间戳、nonce、方法、路径等必须参与拼接签名原文,且与服务端逐字节一致。

如何利用python的hmac模块实现api请求的数据完整性校验?

hmac.new() 的 key 和 msg 参数必须是 bytes 类型

Python 的 hmac.new() 不接受 str 类型的密钥或消息,直接传入字符串会抛出 TypeError: key: expected bytes, but got str。这是最常卡住新手的第一步。

常见错误写法:hmac.new("my_secret", "data", digestmod=hashlib.sha256) —— 这会立即报错。

  • 正确做法:对 key 和 msg 都显式编码,例如 hmac.new(b"my_secret", b"data", digestmod=hashlib.sha256)
  • 如果原始数据是变量(比如 api_key = "abc123"body = '{"id": 1}'),统一用 .encode("utf-8") 转换:hmac.new(api_key.encode("utf-8"), body.encode("utf-8"), digestmod=hashlib.sha256)
  • 注意:空字符串也要编码成 b"",不能传 ""

生成 hex 校验值时别漏掉 .hexdigest()

调用 hmac.new(...).digest() 返回的是 bytes 类型的二进制摘要,而绝大多数 API 要求 header 或 query 中传递的是十六进制字符串(如 "a1b2c3...")。直接把 digest() 结果塞进请求,会导致服务端解析失败或校验不匹配。

Python 3.14.2
Python 3.14.2

Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。

下载
  • 务必使用 .hexdigest():它返回小写十六进制字符串,符合 RFC 和主流 API 规范
  • .digest() 仅在需要原始字节(如进一步加密或拼接)时才用,日常 API 校验几乎不用
  • 示例:sig = hmac.new(k, msg, hashlib.sha256).hexdigest() → 得到 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

时间戳和 nonce 必须参与签名计算

只对请求体(body)做 HMAC 是不安全的——攻击者可重放请求。真实 API(如 AWS Signature、Coinbase Pro、很多金融类接口)要求将时间戳(timestamp)、随机数(nonce)、HTTP 方法、路径等一起纳入签名原文。

典型拼接方式(以 POST /orders 为例):

message = f"POST\n/orders\n{timestamp}\n{nonce}\n{json_body}"
  • 换行符 \n 是分隔符,必须严格一致(不能用 \r\n 或空格)
  • timestamp 通常为秒级或毫秒级 Unix 时间戳(如 str(int(time.time()))),服务端会校验时间窗口(如 ±30 秒)
  • nonce 应为每次请求唯一(可用 uuid.uuid4().hexsecrets.token_urlsafe(16)
  • 若 API 文档指定排序规则(如按字母序拼接 query 参数),必须严格遵循,否则签名不一致

对比服务端签名时注意大小写和编码一致性

客户端生成的 signature 和服务端比对失败,80% 情况不是算法问题,而是两边对“同一段原文”的理解不同。

  • 检查服务端文档是否要求对 body 做规范化处理(如移除空格、排序 JSON key、URL 编码 query 参数)
  • 确认双方使用的 hash 算法完全一致:hashlib.sha256hashlib.sha512,也 ≠ hashlib.sha256().name 字符串误用
  • 某些 API 要求 signature 做 Base64 编码(而非 hex),此时要用 base64.b64encode(hmac_obj.digest()).decode("ascii")
  • header 中传递时注意字段名大小写(如 X-Signature vs x-signature),部分服务端区分大小写
实际跑通的关键在于:所有参与签名的字段,必须和服务端“逐字节一致”。哪怕 body 里多一个空格、timestamp 差 1 秒、nonce 重复,都会导致校验失败。先用固定值(如 timestamp=1000、nonce=test、body='{}')硬编码测试,再逐步放开变量。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1105

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2072

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1185

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8865

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1479

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1552

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

881

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

531

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习