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

