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

Databricks Model Registry Webhook的HMAC验证失效问题求助

Databricks Webhook HMAC验证失败问题解决

核心原因

Databricks Model Registry Webhook发送的X-Databricks-Signature头部值,是HMAC-SHA256计算结果的十六进制字符串。而你替换的hmac.digest()返回的是原始二进制字节序列,两者格式完全不匹配,因此验证必然失败。

官方示例中使用的hexdigest()会将HMAC二进制结果转换为十六进制字符串,这才和Databricks传递的签名格式完全对齐。

格式差异示例

假设HMAC计算后的原始二进制为b'\x0f\x4a\x7d':

  • hexdigest()输出:"0f4a7d"(和Databricks签名格式一致)
  • digest()输出:b'\x0f\x4a\x7d'(原始字节,无法和十六进制字符串匹配)

修复方案

将代码改回使用hexdigest(),同时注意以下细节:

  • 确保shared_secret是Webhook配置时设置的密钥,且已编码为UTF-8字节串
  • 请求体必须使用原始未修改的字节,不能解析后重新序列化(会改变字符编码、空格/换行符等,导致HMAC计算结果偏差)
  • 始终用hmac.compare_digest()做对比,避免时序攻击风险

修正后的代码:

import hmac
import hashlib
import json

secret = shared_secret.encode('utf-8')
signature_key = 'X-Databricks-Signature'

def validate_signature(request):
    if signature_key not in request.headers:
        raise Exception('No X-Signature. Webhook not be trusted.')

    x_sig = request.headers.get(signature_key)
    body = request.body.encode('utf-8')
    h = hmac.new(secret, body, hashlib.sha256)
    computed_sig = h.hexdigest()

    if not hmac.compare_digest(computed_sig, x_sig):
        raise Exception('X-Signature mismatch. Webhook not be trusted.')

注:代码中把已废弃的request.headers.has_key()替换为Python3推荐的signature_key not in request.headers写法。

内容的提问来源于stack exchange,提问作者Andres Bores

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:32:15