You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask服务端对URL编码的HMAC标签与AES随机数解码并保留字节码?

AES HMAC标签与随机数的URL编码处理解决方案

问题场景

客户端发送包含AES HMAC标签和随机数(nonce)的二进制Payload,原始数据示例:

# tag:  b'=x\x9d{_0\xf9;c8\x94inc]\xb1'
# nonce:  b'\x1f\xf4\xbe\xcc\xf2\x84f\xf2*\x8dP\x16\xc8\x02\xfe\xbe'

requests.post(url, data=payload, headers={"Content-Type": "application/octet-stream"}, verify="myShnazzyCertificate.pem")

但Flask服务端收到的数据被URL编码,导致标签和随机数格式异常:

data = flask.request.data
# 处理后打印结果
# tag:  b'%3Dx%9D%7B_0%F9%3Bc8%94inc%5D%B1'
# nonce:  b'%1F%F4%BE%CC%F2%84f%F2%2A%8DP%16%C8%02%FE%BE'

手动替换%为\x的方法无法处理{、*等特殊字符的编码,导致HMAC验证失败。


解决方法

1. 服务端解码URL编码的字节数据

使用Python标准库的unquote_to_bytes函数,它能正确解析所有URL编码的字符(包括%7B、%2A这类特殊符号),还原原始字节格式:

from urllib.parse import unquote_to_bytes
import flask

# 从request.data中拆分出URL编码后的tag和nonce字节
tag_encoded = b'%3Dx%9D%7B_0%F9%3Bc8%94inc%5D%B1'
nonce_encoded = b'%1F%F4%BE%CC%F2%84f%F2%2A%8DP%16%C8%02%FE%BE'

# 解码还原原始字节
tag_decoded = unquote_to_bytes(tag_encoded)
nonce_decoded = unquote_to_bytes(nonce_encoded)

# 验证解码结果
print("解码后的tag:", tag_decoded)  # 输出: b'=x\x9d{_0\xf9;c8\x94inc]\xb1'
print("解码后的nonce:", nonce_decoded)  # 输出: b'\x1f\xf4\xbe\xcc\xf2\x84f\xf2*\x8dP\x16\xc8\x02\xfe\xbe'

2. 客户端避免URL编码的发送方式

如果不想让数据被URL编码,需确保发送的是纯二进制字节流,而非表单格式数据。可以通过struct模块将tag和nonce打包成固定格式的字节串,再直接发送:

import struct
import requests

# 原始的tag和nonce字节
tag = b'=x\x9d{_0\xf9;c8\x94inc]\xb1'
nonce = b'\x1f\xf4\xbe\xcc\xf2\x84f\xf2*\x8dP\x16\xc8\x02\xfe\xbe'

# 按固定长度打包(示例:nonce和tag均为16字节,根据实际长度调整格式符)
# '16s16s'表示两个16字节的字符串(字节串)
payload = struct.pack('16s16s', nonce, tag)

# 发送请求,指定Content-Type为application/octet-stream
url = "你的Flask接口地址"
response = requests.post(
    url,
    data=payload,
    headers={"Content-Type": "application/octet-stream"},
    verify="myShnazzyCertificate.pem"
)

这样服务端收到的就是原始二进制数据,无需额外解码。


内容的提问来源于stack exchange,提问作者Ryan Farber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:21:15