Webhook 是外部服务向我的服务器推送事件的方式。然而任何人都可以向该 URL 发送请求,因此必须确认收到的请求 是否真的来自那个服务。此时采用的标准方法便是 HMAC 签名。
发送方与接收方共享一个 密钥。发送方用密钥对请求正文做 HMAC-SHA256 哈希,将签名放入请求头一并发送。接收方用相同的密钥对相同的正文做哈希,比对两个签名是否 一致。
若一致,则同时保证两点:只有持有密钥的一方才能生成正确的签名,从而确认 真实性;正文一旦有丝毫改动签名就会不同,从而确认 完整性。GitHub·Stripe·Slack 等大多数 Webhook 都采用这种方式。
您可以在 AG HASH 中直接验证。开启 HMAC 选项并输入共享密钥后,粘贴请求正文即可得到 HMAC-SHA256 值,再与请求头中的签名比对即可。在实际验证中,建议使用可规避计时攻击的常量时间比较。