如何在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
相关产品推荐
相关产品推荐

