security - Webhook 安全性 - HMAC 与回调 URL 中的令牌
问题描述
谈到 Webhook 安全性,我看到标准是使用 HMAC。每一方都有一个相同的共享秘密。发布者使用共享密钥加密他的请求正文,并将加密的哈希放在其 webhook 通知的标头中。然后,订阅者使用共享密钥加密正文,并确认他的哈希与发布者提供的哈希匹配。通过阅读,我了解到这样做是为了让订阅者确信“身体没有被篡改”。
我的问题是,身体怎么可能被篡改?假设我们都在使用 HTTPS,黑客不需要破解 SSL 加密来修改正文吗?Twilio使用帐户身份验证令牌作为共享机密。但是,如果黑客能够打开请求正文并对其进行篡改,他们难道不能在发送授权时获取 Auth Token 吗?然后他们可以用他们抓住的秘密来欺骗加密。
那么,为什么要经历另一层安全性的麻烦,而不是让订阅者使用在 URL 路径中具有令牌的回调 URL。URL 将与正文一起加密。我看不出攻击者如何滥用这种方法。
谢谢!
解决方案
身体怎么可能被篡改?
它不需要。您的服务器接受来自任何人的传入 HTTP(S) 请求。HTTPS 不能保证发送者的真实性或身份,它只保证发送者和接收者可以在没有第三方拦截的情况下交换消息。
*除了服务器证书,还可以使用客户端证书,因此HTTPS可以相互验证两端的身份;不幸的是,它在实践中很少使用,并且正确设置可能有些棘手。这就是为什么通常首选这种替代方案的原因,因为它在实践中更容易实施。
因此,webhook 标头中的 HMAC 试图解决的问题是验证发送者的身份,因为大概只有真实的发送者(Twilio 等)会知道创建 HMAC 的秘密。它允许接收者完全无视发送任意消息的随机第三方。
如果第 3 方拦截了请求,他们可以篡改正文,但他们无法生成新的正确 HMAC,因为他们无权访问密钥,因为密钥不是请求的一部分。
当然,另一种方法是将您希望从中接收 webhook 的一堆 IP 地址列入白名单;但这对于发送服务来说很不方便,因为他们无法根据需要自由分配 IP。它也有轻微的机会受到各种问题的影响,攻击者可能能够(部分)控制 IP,而不会导致密钥的安全漏洞。
推荐阅读
- reactjs - 当用户选择一个选项但随后将其更改为另一个选项时,React 崩溃而不显示错误
- r - 如何在保持子文件夹结构的同时在 R 中复制和压缩文件
- reactjs - 导入函数反应组件时出错
- python - Python包将两个热图合二为一(将每个正方形分成两个三角形)
- google-cloud-platform - 使用 Dataflow 的 DLP 从 GCS 读取并写入 BigQuery - 只有 50% 的数据写入 BigQuery
- python - 带有特殊字符的 String.replace() 仅替换其中一些字符
- babeljs - Babel 配置/不一致问题
- html - flex 内部有 2 个 div(左右),带有嵌套的 flex div。现在右边的 div 在左边。如何在他们之间制造差距?
- python - 对 np.random 使用循环或将数组重塑为矩阵?
- vue.js - 我正在使用 v-for 遍历我的数组,并且我希望每个项目都转到特定的网格位置。我怎么做?