Python中Django怎么做API接口的签名验证_防止数据篡改的防重放防伪造落地方案

雨杰小哥_2045

雨杰小哥_2045

2026-04-25

860人浏览

原创

HMAC-SHA256是当前最稳妥的签名验证算法:带密钥、抗长度扩展、Python原生支持;需结合时间戳窗口校验与Redis缓存nonce防重放,并统一签名原文格式。

python中django怎么做api接口的签名验证_防止数据篡改的防重放防伪造落地方案

签名验证该用什么算法:HMAC-SHA256 是当前最稳妥的选择

Django 自身不提供开箱即用的 API 签名机制,必须自己实现。选算法时别纠结 MD5 或 SHA1——它们已被证明不安全;hashlib.md5 和 hashlib.sha1 在签名场景下应直接排除。HMAC-SHA256 是事实标准:它带密钥、抗长度扩展、Python 原生支持且性能足够。

  • Django 项目里统一用 hmac.new + hashlib.sha256,不要手写拼接字符串再哈希
  • 密钥(SECRET_KEY)不能硬编码在视图里,应从环境变量或 Django 的 settings.SECRET_API_KEY 读取
  • 签名原文必须包含时间戳(timestamp)、随机串(nonce)、HTTP 方法、完整路径、查询参数(按字典序排序)、请求体(仅当 Content-Type 为 application/json 时取 request.body 原始字节)
import hmac
import hashlib
import json
<p>def generate_signature(payload_dict, secret_key: bytes) -> str:</p><h1>payload_dict 包含 method, path, query_string, timestamp, nonce, body_bytes(可选)</h1><pre class="brush:python;toolbar:false;">msg = f"{payload_dict['method']}\n{payload_dict['path']}\n{payload_dict['query_string']}\n{payload_dict['timestamp']}\n{payload_dict['nonce']}"
if 'body_bytes' in payload_dict:
    msg += f"\n{payload_dict['body_bytes'].decode('utf-8') if isinstance(payload_dict['body_bytes'], bytes) else ''}"
sig = hmac.new(secret_key, msg.encode('utf-8'), hashlib.sha256).digest()
return base64.b64encode(sig).decode('ascii')

防重放的关键不是加时间戳,而是校验窗口期+缓存 nonce

只传 timestamp 参数没用——攻击者可以截获一次合法请求,改个毫秒数再发。真正起作用的是两件事:服务端校验 timestamp 是否落在允许窗口内(比如 ±300 秒),同时用 Redis 缓存已用过的 nonce 值并设置过期时间(必须 ≤ 窗口时长)。

  • 时间窗口建议设为 300 秒,太短影响弱网用户,太长增加重放风险
  • nonce 必须全局唯一(可用 UUID4),且每次请求都不同;Redis key 形如 f"api:nonce:{nonce}",value 可设为任意值,EX 设为 300
  • 校验顺序必须是:先检查 timestamp 是否超窗 → 再查 nonce 是否已存在 → 都通过才继续解析签名
  • 不要用数据库存 nonce:高并发下写入延迟和锁竞争会拖垮接口

Django 中间件怎么拦截并验证签名:别在每个视图里重复写逻辑

把签名验证逻辑塞进视图函数里,等于给每个接口埋雷。正确做法是写一个可配置的中间件,在请求进入视图前完成校验,并提前返回 401/403。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 中间件需支持白名单路径(如 /health/、/docs/),避免对静态资源或登录接口强制验签
  • 从请求头读签名字段(推荐 X-Signature),从 QueryString 读 timestamp 和 nonce,拒绝缺失任一参数的请求
  • 请求体如果是 JSON,必须用 request.body 原始字节参与签名计算;若已触发 request.POST 或 request.data,body 可能被消费过,导致验签失败
  • 验签失败时,直接 return HttpResponse(status=401),不要抛异常——Django 异常会走错误页流程,暴露堆栈且无法控制响应格式

客户端和服务端签名不一致?90% 是这几个细节没对齐

调试阶段最常见的问题是「明明按文档写了,但签名总不匹配」。根本原因往往不是算法错,而是数据预处理不一致:

  • 查询参数排序:服务端用 sorted(request.GET.items()),客户端必须严格按 key 字典序拼接,空值也要保留(如 a=&b=1 ≠ b=1&a=)
  • 路径是否带 query string:签名中的 path 应为 /api/v1/user,不含 ?a=1&b=2,那部分必须单独提取为 query_string 并排序
  • 时间戳单位:服务端用 int(time.time())(秒级),客户端必须同步用秒,不能传毫秒(Date.now() 要除以 1000 并取整)
  • 字符编码:所有字符串参与签名前统一转 UTF-8 字节,JSON body 尤其注意——Python 的 json.dumps(..., separators=(',', ':')) 去空格,否则客户端 JS JSON.stringify() 默认带空格会导致不一致

签名验证本身不难,难的是两端对「签名原文」的定义完全一致。只要有一处空格、换行、排序、编码、单位不匹配,结果就全错。上线前务必用固定测试用例(hardcode timestamp/nonce/body)跑通双向签名比对。

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

相关专题

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

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

2023.07.20

1831

4

python能做什么
python能做什么

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

2023.07.25

4904

7

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

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

2023.07.31

1789

3

python教程
python教程

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

2023.08.03

29397

23

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

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

2023.08.04

3507

5

python eval
python eval

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

2023.08.04

3527

5

scratch和python区别
scratch和python区别

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

2023.08.11

1223

5

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

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

2023.08.10

616

4

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

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

2023.08.11

2743

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习