展开本页目录
开始前准备什么
- 下载独立练习包,保留 starter、reference 和原始输入。
- Python 3、OpenSSL和支持Web Crypto的本地浏览器。
- 使用n8n原生功能需相应账号和可用额度;本题作者参考可在本地独立运行。
- 固定原始字节和四种请求
- 配置n8n Raw Body与Hmac凭据
- 补上比较、错误出口与响应
- 发送正确字节与签名
- 只改空格并复用旧签名
- 核对四行响应与业务分支
- 用独立OpenSSL校验接收器
starter、任务提示、具体输入、作者人工可运行参考与独立验证;不含账号/密钥/运行时数据库。
按本文环境运行,再对照原始输入和正反例。
1. 固定原始字节和四种请求
四份请求围绕同一 UTF-8 基准 JSON:正确签名、只改空格、改count、缺签名。教学secret是公开无效固定值,不能复制到生产。
2. 配置n8n Raw Body与Hmac凭据
在 n8n Webhook 开 Raw Body,按实际版本确认原始内容字段;配置 Crypto 的 Hmac/SHA256/hex 和独立 Crypto 凭据。包内 node-mapping.json 是节点合同,未验证可直接导入。
交给目标 AI 工具的任务提示
输入为固定 UTF-8 请求体和 x-exercise-signature 十六进制摘要;以原始 bytes 而不是 JSON.stringify 后的值计算 HMAC-SHA256。摘要节点后接明确比较/错误分支与 Respond to Webhook;比较策略不能冒称 Crypto 已自动验签。3. 补上比较、错误出口与响应
Digest 节点后仍需明确比较摘要、拒绝缺失/坏签名并分支响应;Code crypto 的运行时支持由自托管环境另验,不能说 Crypto 自动完成任意平台验签。
4. 发送正确字节与签名
运行本地 server.py,点“原字节/正确签名”;浏览器 Web Crypto 发送到真实HTTP,接收器应200且 businessContinued=true。
5. 只改空格并复用旧签名
点“只改一个空格”,即便 JSON 语义不变,复用旧签名也应403。计算的是原始字节,不是重新 JSON.stringify 的文本。
6. 核对四行响应与业务分支
再点篡改count和缺签名,四行矩阵应为200/403/403/403,拒绝均不继续业务。原生 n8n 执行轨迹需要可用平台另采集。
7. 用独立OpenSSL校验接收器
运行 python3 reference/verify.py,由独立 OpenSSL 生成基准摘要再请求 Python 接收器。此合同不含时间窗/nonce,不能宣称已防重放。
怎样确认已经完成
- 正确字节/正确签名可通过,改空格但复用旧签名、篡改内容和缺签名均拒绝。
- n8n 的原始字节/计算摘要与 Python 基准一致;不以重新序列化后的 JSON 代替。
- 拒绝响应不会继续业务节点,公开 workflow 不含 secret/凭据 ID 或实际 webhook 生产 URL。
常见问题
n8n Webhook 怎么验证请求是不是自己发来的?
在 n8n Webhook 开 Raw Body,按实际版本确认原始内容字段;配置 Crypto 的 Hmac/SHA256/hex 和独立 Crypto 凭据。包内 node-mapping.json 是节点合同,未验证可直接导入。
Webhook 的 JSON 没变但空格变了,签名为什么失败?
点“只改一个空格”,即便 JSON 语义不变,复用旧签名也应403。计算的是原始字节,不是重新 JSON.stringify 的文本。
哪些结果已执行,哪些仍需原生账号验证?
本地HTTP/Web Crypto/OpenSSL已验原始字节与200/403/403/403矩阵;n8n导入/原生执行未验,节点映射仅是配置合同,HMAC本身不防重放。





