Django怎么做接口加密_签名验证机制防篡改与重放攻击

梦宇酱_2617

梦宇酱_2617

2026-03-23

561人浏览

原创

签名验证必须在视图外层用中间件统一拦截,校验method+path+timestamp+nonce+body+app_key,缓存request.body防重复读,app_secret加密存库并Redis原子校验nonce。

django怎么做接口加密_签名验证机制防篡改与重放攻击

签名验证必须在视图最外层做,不能放在业务逻辑里

签名失效、时间戳过期、重放请求这些校验,如果混在 APIView 的 post() 方法里,很容易被绕过——比如开发者后续加了缓存装饰器、权限中间件顺序错乱,或者用了 @action 路由但忘了复刻校验逻辑。正确做法是用 Django 中间件或自定义装饰器统一拦截所有 API 请求,在进入路由分发前就完成基础签名验证。

推荐用中间件,因为能覆盖所有 /api/ 路径,且不依赖视图类写法。关键点:只对指定前缀(如 /api/v1/)和特定 HTTP 方法(POST、PUT、PATCH)做校验;跳过登录、健康检查等免签接口;校验失败直接返回 401 或 403,不进视图。

  • 时间戳误差容忍建议设为 300 秒(5 分钟),太短影响弱网用户,太长增加重放窗口
  • 签名算法必须包含 method + path + timestamp + nonce + body(若存在)+ app_key,缺一不可
  • 不要用 request.GET 拼接签名原文——URL 编码不一致会导致签名不匹配,应统一用原始请求路径 + 解析后的 query dict 排序后拼接

body 签名必须读取一次且仅一次

Django 的 request.body 是个流对象,读完就空了。如果在签名验证时调用了一次 request.body,后面视图里再读就会得到空字节串,导致 JSONParser 解析失败或 form-data 丢失字段。

解决办法是在中间件里把原始 body 缓存到 request._cached_body,并重置 request._body,让后续解析正常工作。同时注意:如果请求是 multipart/form-data,不能直接读 body,得从 request.POST 和 request.FILES 提取参数再构造签名原文(通常这类接口不建议签名 body,改用 query + header 更稳妥)。

  • 对 JSON 接口:用 json.loads(request.body.decode()) 构造有序键的字符串参与签名,但必须先 request.body.seek(0) 或缓存原始 bytes
  • 避免在签名逻辑里调用 request.data 或 request.json()——它们会触发 DRF 的解析器,破坏原始流
  • 测试时用 curl -H "Content-Type: application/json" -d '{"a":1}' ...,别用表单格式混用

密钥管理不能硬编码,也不该存在 settings.py 里

SECRET_KEY 是全局加密用的,不能拿来当接口签名密钥——它一旦泄露,整个站点加密体系崩塌。每个接入方(App)应该有独立的 app_secret,且不能明文写在代码或配置文件中。

Django Wrap
Django Wrap

强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该

下载

推荐方案:把 app_key → app_secret 映射存在数据库(如 AppCredential 模型),查库时加缓存(cache.get_or_set),并设置合理过期时间(如 5 分钟)。查询失败或密钥不匹配,一律按“无效签名”处理,不暴露是否存在该 app_key。

  • 数据库字段 app_secret 必须用 django.contrib.auth.hashers.make_password() 加密存储,不能明文或 base64
  • 不要用环境变量传 app_secret——运维部署时容易泄漏,且无法按 app 动态轮换
  • 签名计算时用 hmac.new(key.encode(), msg.encode(), digestmod='sha256').hexdigest(),别用 hashlib.md5 这种已被证明不安全的算法

重放攻击靠 nonce + redis 实现,别依赖数据库唯一索引

只靠数据库 unique_together = ('app_key', 'nonce') 挡不住高并发重放:两个相同请求几乎同时到达,可能都通过唯一性校验(数据库事务隔离级别不足)。真正可靠的做法是用 Redis 做原子性 setnx + expire。

流程:收到请求后,用 f"{app_key}:{nonce}" 为 key,执行 redis.setex(key, 300, "1");若返回 False,说明已存在,拒绝请求。key 过期时间必须等于时间戳容忍窗口(如 300 秒),否则旧 nonce 可能被重复利用。

  • Redis 连接必须配置连接池,避免每次校验都新建连接拖慢响应
  • 如果 Redis 不可用,应降级为只校验时间戳(不校验 nonce),而不是直接放过——宁可误杀,不可放行
  • nonce 长度建议 ≥ 16 字符,用 secrets.token_urlsafe(16) 生成,别用时间戳或自增 ID

签名机制真正的复杂点不在算法本身,而在于 body 流控制、密钥生命周期、以及重放校验在分布式环境下的原子性保障。这三个地方任意一个没对齐,防篡改就形同虚设。

相关专题

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

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

2023.07.20

1831

4

python能做什么
python能做什么

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

2023.07.25

4884

7

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

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

2023.07.31

1789

3

python教程
python教程

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

2023.08.03

29237

23

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

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

2023.08.04

3487

5

python eval
python eval

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

2023.08.04

3507

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

2723

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 6.1 官方文档
Django 6.1 官方文档

共0课时 | 0人学习

Django 教程
Django 教程

共28课时 | 9.9万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 2万人学习