电话
400 9058 355
Python防止重放攻击需同时满足唯一性、时效性、不可复用性:①加时间戳并校验±30秒窗口;②用UUID nonce+Redis缓存防重复;③对方法、路径、时间戳、nonce、排序参数及原始请求体哈希做HMAC-SHA256签名;④强制HTTPS传输。
Python 防止重放攻击的核心是确保每个请求具备唯一性、时效性和不可复用性。关键不在于加密本身,而在于对请求内容增加动态签名和时间约束。
在请求中嵌入当前时间戳(如 Unix 时间秒数或毫秒),服务端收到后检查是否落在允许的时间窗口内(例如 ±30 秒)。超出即拒绝,避免旧请求被重复提交。
timestamp = int(time.time())
if abs(timestamp - time.time()) > 30: raise ValueError("Request expired")
每次请求携带一个服务端未见过的随机字符串(如 UUID4),服务端缓存已使用的 nonce(推荐 Redis + 过期时间),重复出现即视为重放。
nonce = str(uuid.uuid4())
redis.setex(f"nonce:{nonce}", 60, "1")(60 秒后自动清理)redis.get(f"nonce:{nonce}") 存在,说明该 nonce 已用过,直接拦截将请求方法、路径、时间戳、nonce 和排序后的参数拼接后,用服务端与客户端共享的密钥生成 HMAC-SHA256 签名,作为请求头(如 X-Signature)发送。服务端用相同逻辑重新计算比对。
f"GET|/api/user|{timestamp}|{nonce}|id=123&name=test"
hmac.new(key, msg.encode(), hashlib.sha256).hexdigest()
即使有签名,也必须强制使用 HTTPS,防止中间人篡改或窃取签名参数。同时,对 POST/PUT 请求体(如 JSON)参与签名计算,避免攻击者仅修改 body 绕过校验。
body = request.get_data() # Flask;或 Django 中用 request.body

body 的 SHA256 哈希值纳入签名原文,或直接将规范化的 JSON 字符串参与拼接request.json(可能触发解析副作用),优先用原始字节流保证一致性
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...