正确构造HMAC-SHA256签名需严格按字典序排序参数、URL-safe编码(quote非quote_plus)、密钥与消息均转bytes;timestamp和nonce须符合服务端时效与唯一性要求。
Python 接口签名用 HMAC 实现并不难,但参数顺序、编码方式、密钥处理稍有偏差就会返回 401 Unauthorized 或 signature mismatch —— 这类问题 80% 出在字符串拼接前没统一编码或忽略空格/换行。
签名本质是「对确定顺序的参数做确定方式的摘要」。服务端和客户端必须严格一致:参数先按 key 字典序排序,再拼成 key1=value1&key2=value2 形式,且所有 value 必须做 URL-safe 的 urllib.parse.quote(不是 quote_plus),空格要编码为 %20 而非 +。
常见错误:
json.dumps() 直接序列化 dict → 键顺序不固定,且引号、空格、斜杠编码不匹配timestamp、nonce),或传了服务端未约定的字段hmac.new() → Python 3 下会报 TypeError: key must be bytes or bytearray
hmac.new() 的 key 和 msg 都必须是 bytes,且服务端通常要求密钥是原始字节(不是 base64 解码后、也不是 hex 解码后)。如果 API 文档给的是 base64 格式的 secret,得先 base64.b64decode();如果是十六进制字符串(如 "a1b2c3..."),得用 bytes.fromhex()。
示例(标准流程):
import hmac import hashlib import urllib.parseparams = { "appid": "abc123", "timestamp": "1718234567", "nonce": "xYz9AbC", "data": "hello 世界" }
1. 按 key 排序并 url-quote value(保留斜杠,不编码 /)
sorted_items = sorted(params.items()) query_string = "&".join(f"{k}={urllib.parse.quote(v, safe='')}" for k, v in sorted_items)
2. 密钥处理:假设 secret 是 base64 编码的字节串
secret_b64 = "dGhpcyBpcyBhIHNlY3JldA==" secret_bytes = base64.b64decode(secret_b64)
3. 计算签名(注意 msg 也必须是 bytes)
signature = hmac.new( key=secret_bytes, msg=query_string.encode('utf-8'), digestmod=hashlib.sha256 ).digest()
4. 通常要求 base64 编码结果(不是 hex)
signature_b64 = base64.b64encode(signature).decode('ascii')
很多接口要求 timestamp 是秒级 Unix 时间戳,且与服务器时间偏差不超过 300 秒;nonce 必须每次唯一(常用 uuid.uuid4().hex[:16] 或 secrets.token_urlsafe(16)),服务端会缓存最近 N 个 nonce 防重放。这两项若校验失败,签名即使完全正确也会被拒。
调试建议:
timestamp 和 nonce(如 "1718234567" 和 "testnonce")跑通一次,排除动态值干扰query_string 打印出来,和服务端日志里的原始待签名串比对(注意空格、编码、大小写)绝大多数签名失败不是算法写错,而是「输入不一致」:
urllib.parse.quote(value, safe='') != urllib.parse.quote_plus(value):后者把空格变 +,前者变 %20,多数接口要求后者hmac.new() → 必须显式 .encode('utf-8') 或 base64.b64decode()
dict.keys()(无序),或用了 json.dumps(dict, sort_keys=True)(带空
格和引号)只要 query_string 字符串和服务端完全一致,HMAC 结果就一定一致。调试时宁可多打一行 print(repr(query_string)),也别靠猜。
# python
# js
# json
# 编码
# app
# 字节
# mac
# unix
# python接口
# 为什么
相关文章:
建站之星在线版空间:自助建站+智能模板一键生成方案
如何选择适合PHP云建站的开源框架?
如何基于云服务器快速搭建网站及云盘系统?
如何在阿里云域名上完成建站全流程?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
建站之星如何取消后台验证码生成?
七夕网站制作视频,七夕大促活动怎么报名?
网站制作说明怎么写,简述网页设计的流程并说明原因?
建站主机CVM配置优化、SEO策略与性能提升指南
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
建站主机如何安装配置?新手必看操作指南
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
网站微信制作软件,如何制作微信链接?
已有域名和空间如何搭建网站?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
香港服务器部署网站为何提示未备案?
如何有效防御Web建站篡改攻击?
济南专业网站制作公司,济南信息工程学校怎么样?
南宁网站建设制作定制,南宁网站建设可以定制吗?
如何通过VPS搭建网站快速盈利?
如何高效完成独享虚拟主机建站?
python的本地网站制作,如何创建本地站点?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何通过主机屋免费建站教程十分钟搭建网站?
网站制作报价单模板图片,小松挖机官方网站报价?
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何零成本快速生成个人自助网站?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
建站之星后台密码遗忘如何找回?
建站之星图片链接生成指南:自助建站与智能设计教程
建站之星后台管理:高效配置与模板优化提升用户体验
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
建站主机选虚拟主机还是云服务器更好?
建站上传速度慢?如何优化加速网站加载效率?
高端建站三要素:定制模板、企业官网与响应式设计优化
如何选择CMS系统实现快速建站与SEO优化?
Android使用GridView实现日历的简单功能
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
html制作网站的步骤有哪些,iapp如何添加网页?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
相册网站制作软件,图片上的网址怎么复制?
建站之星导航配置指南:自助建站与SEO优化全解析
如何在Golang中指定模块版本_使用go.mod控制版本号
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何在阿里云完成域名注册与建站?
宝塔建站后网页无法访问如何解决?
*请认真填写需求信息,我们会在24小时内与您取得联系。