如何验证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
相关产品推荐
相关产品推荐

