生成用于签名校验的 Webhook Secret,适用于 GitHub、Stripe、Shopify 等集成。
安全、随机、本地生成。
输出格式:自定义字符集
拒绝 5 分钟前的请求,降低重放攻击风险。
比较签名时使用 timingSafeEqual 或 compare_digest。
保留两把密钥以便平滑轮换,不丢 Webhook。
Webhook Secret 是共享密钥,用于对 Webhook 载荷进行签名并验证真实性。GitHub、Stripe、Shopify 等在发送 Webhook 时会携带 HMAC 签名,你可以用该密钥验证请求是否被篡改。
我们的生成器生成可用于生产环境的安全密钥。请勿在前端或公开仓库中泄露该密钥。
使用 X-Hub-Signature-256,HMAC-SHA256。
Header 格式:sha256=<signature>
Stripe-Signature 头,包含时间戳与版本。
HMAC-SHA256,含重放保护
使用 X-Shopify-Hmac-SHA256,Base64 编码签名。
Base64 编码的 HMAC-SHA256
多数平台使用 HMAC-SHA256 并通过头部传递签名。
常见头:X-Signature、X-Webhook-Signature
以下示例演示如何验证 Webhook 签名:
const crypto = require('crypto');
function verifyGitHubWebhook(payload, signature, secret) {
const hmac = crypto.createHmac('sha256', secret);
const digest = 'sha256=' + hmac.update(payload).digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(digest)
);
}
// Usage
app.post('/webhook', (req, res) => {
const signature = req.headers['x-hub-signature-256'];
const payload = JSON.stringify(req.body);
const secret = process.env.WEBHOOK_SECRET;
if (verifyGitHubWebhook(payload, signature, secret)) {
// Webhook is authentic
res.status(200).send('OK');
} else {
res.status(401).send('Unauthorized');
}
});import stripe
import os
# Stripe provides a helper library
stripe.api_key = os.environ['STRIPE_API_KEY']
endpoint_secret = os.environ['WEBHOOK_SECRET']
@app.route('/webhook', methods=['POST'])
def webhook():
payload = request.data
sig_header = request.headers.get('Stripe-Signature')
try:
event = stripe.Webhook.construct_event(
payload, sig_header, endpoint_secret
)
# Webhook verified successfully
return 'OK', 200
except ValueError:
return 'Invalid payload', 400
except stripe.error.SignatureVerificationError:
return 'Invalid signature', 401建议至少 32 字符(256 bit)。我们默认输出适合生产的长度。
不建议。不同服务应使用不同密钥,便于独立轮换与隔离风险。
立即生成新密钥并更新服务端与平台配置,同时排查可疑请求。
通常同一服务一个 Secret 即可。如果同服务有多个 Webhook 端点,建议每个端点用不同 Secret。
所有 Webhook Secret 均在浏览器本地生成,使用 Web Crypto API 的加密级随机数。不会上传或存储任何数据。