Python Flask项目如何防止接口数据篡改_使用数字签名与哈希校验

风婷吖_7086

风婷吖_7086

2026-05-18

676人浏览

原创

flask接口签名验证需在视图函数内统一提取原始请求数据(url参数字典序拼接+原始body字节+timestamp+nonce),用hmac-sha256计算并hmac.compare_digest校验,失败立即abort(401)。

python flask项目如何防止接口数据篡改_使用数字签名与哈希校验

Flask 接口怎么加签名验证

直接在视图函数里做校验,别依赖中间件或装饰器堆砌逻辑——签名验证必须和业务参数强绑定,否则容易漏掉 request.args 或 request.json 里的关键字段。

常见错误是只对 request.json 签名,但实际请求可能走 application/x-www-form-urlencoded,或者混合了 URL 参数和 body。必须统一提取原始字节再哈希。

  • 用 request.get_data(cache=True, as_text=False) 拿原始 body,避免 Flask 自动解析破坏顺序
  • URL 参数要按字典序拼接(sorted(request.args.items())),不能直接用 request.url,因为可能含无关 query(如跟踪参数)
  • 签名字段必须包含时间戳 timestamp 和随机数 nonce,两者都参与签名计算,且服务端需校验 timestamp 是否在 5 分钟内
  • 密钥不硬编码,从环境变量读取:os.environ.get("API_SECRET_KEY")

签名算法选 HMAC-SHA256 还是 RSA

HMAC-SHA256 更合适:Flask 是服务端单点部署,不需要非对称加密的分发优势;RSA 签名校验慢、实现易出错(比如私钥格式、padding 方式),还容易被绕过(如传空 signature 字段跳过验证)。

性能上,HMAC 在 Python 里用 hmac.new() 足够快,10k QPS 下 CPU 开销可忽略;而 RSA 的 verify() 在 PyCryptodome 里默认做完整 PKCS#1 v1.5 校验,失败时抛异常,但错误信息可能暴露签名结构。

  • 务必用 hmac.compare_digest() 对比签名,防止时序攻击
  • 签名原文格式固定为:f"{sorted_params_str}&{body_bytes.hex()}&{timestamp}&{nonce}",其中 sorted_params_str 是 "k1=v1&k2=v2" 形式
  • 不要 base64 encode 后再 hex,直接 hmac.new(...).digest().hex(),减少编解码误差

前端传签名时容易漏掉的三个字段

前端 JS 发请求时,常以为只要塞个 X-Signature header 就行,结果后端校验总失败——问题往往出在没同步传全签名依据字段。

Forge — Python Developer
Forge — Python Developer

Python开发助手 — 自动化脚本、API封装、命令行工具、数据管道、网页爬虫。经过测试的代码,包含错误处理和文档。当你需要...

下载

这三个字段必须作为普通请求参数(query 或 body)显式传递,不能只放 header 里:

  • timestamp:毫秒级时间戳,前后端用同一时区(推荐 UTC)
  • nonce:每次请求唯一字符串(可用 uuid4().hex[:16]),服务端需缓存最近 100 个做重复请求拦截
  • sign_method:固定值 "HMAC-SHA256",方便未来扩展其他算法,也避免前端误用 MD5

如果用 axios,记得在 params 或 data 里写明它们,而不是只塞进 headers。

Flask 中怎么安全地校验签名并提前中断

校验必须在业务逻辑执行前完成,且失败时直接返回 401,不能继续往下走——否则可能触发数据库查询或日志记录,反而暴露接口行为。

别用 try/except 包裹整个视图,而是单独抽一个 verify_request_signature() 函数,在 request context 里调用,校验失败就 abort(401)。

  • 检查 request.headers.get("X-Signature") 是否存在,为空直接 401
  • 从 request.args 和 request.form 合并参数时,注意 request.json 可能为 None,要用 request.get_json(silent=True)
  • 生成服务端签名后,用 hmac.compare_digest(sig_from_header, server_sig),不用 ==
  • 校验通过后再解析 JSON 或读取 form,避免无效请求消耗解析资源

最麻烦的其实是时钟不同步——别依赖 NTP 自动校准,上线前用 ntpq -p 看服务器时间偏差,超过 30 秒就手动 ntpdate 一次。这个点很容易被忽略,但会导致所有签名突然失效。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

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

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

2023.07.20

1731

4

python能做什么
python能做什么

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

2023.07.25

4424

7

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

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

2023.07.31

1709

3

python教程
python教程

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

2023.08.03

25957

23

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

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

2023.08.04

3147

5

python eval
python eval

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

2023.08.04

3167

5

scratch和python区别
scratch和python区别

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

2023.08.11

1183

5

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

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

2023.08.10

596

4

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

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

2023.08.11

2463

5

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习