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

如何验证Revolut Webhook请求的合法性?

验证Revolut Webhook请求真实性的方案

核心方法:HMAC签名校验

Revolut通过请求头签名的方式让你验证Webhook请求的合法性,具体步骤如下:

1. 获取Webhook签名密钥

登录Revolut商家后台,进入Webhook配置页面,复制专属的Webhook签名密钥(务必妥善保管,不要对外泄露)。

2. 提取请求中的关键头信息

Revolut的Webhook请求会携带两个必填HTTP头:

  • X-Revolut-Signature:服务端生成的签名值
  • X-Revolut-Timestamp:请求发送的时间戳

3. 构造待签名的字符串

将时间戳和原始请求体用冒号(:)拼接,格式如下:

<X-Revolut-Timestamp的值>:<原始请求体内容>

注意:请求体必须是未修改的原始数据,包括空格、换行符等格式细节,不能做任何预处理。

4. 生成校验签名

使用你的Webhook密钥,对构造好的字符串进行HMAC-SHA256加密,再将加密结果转换为Base64编码。

5. 对比签名验证合法性

将你生成的签名与请求头X-Revolut-Signature的值做对比:

  • 完全匹配则说明请求来自Revolut,可正常处理
  • 不匹配则直接拒绝该请求,避免恶意伪造

代码示例(Python)

import hmac
import base64
from flask import request

# 替换为你的Revolut Webhook签名密钥
WEBHOOK_SECRET = "your_revolut_webhook_secret"

def validate_revolut_webhook():
    timestamp = request.headers.get("X-Revolut-Timestamp")
    received_signature = request.headers.get("X-Revolut-Signature")
    raw_body = request.get_data(as_text=True)

    # 构造待签名载荷
    payload = f"{timestamp}:{raw_body}"
    # 生成HMAC-SHA256签名并转Base64
    computed_signature = base64.b64encode(
        hmac.new(WEBHOOK_SECRET.encode(), payload.encode(), digestmod="sha256").digest()
    ).decode()

    # 安全对比签名(避免时序攻击)
    return hmac.compare_digest(computed_signature, received_signature)

额外安全加固措施

  • 时间戳校验:检查X-Revolut-Timestamp与当前时间的差值是否在合理范围(比如5分钟内),防止重放攻击
  • 强制HTTPS:确保你的Webhook接收端点使用HTTPS协议,避免请求在传输过程中被篡改
  • 拦截无效请求:如果请求缺少X-Revolut-Signature或X-Revolut-Timestamp头,直接返回403拒绝

内容的提问来源于stack exchange,提问作者Kha Vĩ Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:49:59