Webhook 安全性 - 回调中的 HMAC 与令牌 URL
Webhook Security - HMAC vs Token in Callback URL
谈到 Webhook 安全性,我看到标准是使用 HMAC。每一方都有一个相同的共享秘密。发布者使用共享密钥对其请求 body 进行加密,并将加密后的哈希值放入其 webhook 通知的 header 中。订阅者然后使用共享秘密加密 body 并确认他的散列与发布者提供的散列相匹配。通过阅读,我了解到这样做是为了让订阅者确信“body 没有被篡改”。
我的问题是,body 是如何被篡改的?假设我们都在使用 HTTPS,黑客不需要破解 SSL 加密来修改 body 吗? Twilio 使用帐户身份验证令牌作为共享机密。但是,如果黑客能够打开一个请求 body 并对其进行篡改,他们是否能够在发送授权时获取 Auth Token?然后他们可以用他们获得的秘密来欺骗加密。
那么,为什么要经历另一层安全的麻烦,而不是让订阅者使用在 URL 路径中具有令牌的回调 URL。 URL 将与 body 一起加密。我看不出攻击者如何滥用这种方法。
谢谢!
共享秘密的目的是双方提前知道秘密,所以不发送(否则就不是秘密了)。使用您的 Twilio 示例,我检查了文档,它没有说明除签名之外的其他 headers,并且参数的 none 也是一个令牌,因此您提到的身份验证令牌不是包括。相反,两端都知道身份验证令牌,并且他们使用它来 generate/verify 签名。
如果有人要拦截和修改消息,他们需要知道秘密以重新签名消息才能使消息有效,除非一方泄露秘密,否则秘密将保持未知,任何修改的数据无法有效签名。如果传递了一个令牌,攻击者只需要拦截一个样本,然后就可以自由地使用有效令牌生成他们自己的消息。这显然不太安全。
至于 SSL,来源可以被欺骗,除非提供客户端证书(Twilio 不提供),否则无法确定是谁发送了请求,因此 SSL 本身不提供身份验证。
how could the body be tampered with?
不需要。您的服务器接受来自任何 body 的传入 HTTP(S) 请求。 HTTPS 不能保证发送者的真实性或身份,它只保证发送者和接收者可以在没有第三方拦截的情况下交换消息。
* 除了服务器证书外还可以使用客户端证书,因此 HTTPS 可以 验证身份两端相互连接;不幸的是,它很少在实践中使用,并且正确设置可能有些棘手。这就是为什么通常首选这种替代方案,因为它在实践中更容易实施。
所以 Webhook 中的 HMAC header 试图解决的问题是 验证发件人的身份 ,因为大概只有真实的发件人(Twilio 等) .) 会知道创建 HMAC 的秘密。它允许接收方完全忽略发送任意消息的随机第 3 方。
如果第 3 方拦截了请求,他们可以篡改 body,但他们无法生成新的正确 HMAC,因为他们无权访问秘密,因为秘密不是一部分请求的。
当然,另一种方法是将您希望从中接收 webhook 的一组 IP 地址列入白名单;但这对于发送服务来说是不方便的,因为他们不能根据需要自由分配他们的IP。它也有可能容易受到各种问题的影响,在这些问题中,攻击者可能能够(部分)控制 IP,而不会以其他方式对密钥造成安全漏洞。
谈到 Webhook 安全性,我看到标准是使用 HMAC。每一方都有一个相同的共享秘密。发布者使用共享密钥对其请求 body 进行加密,并将加密后的哈希值放入其 webhook 通知的 header 中。订阅者然后使用共享秘密加密 body 并确认他的散列与发布者提供的散列相匹配。通过阅读,我了解到这样做是为了让订阅者确信“body 没有被篡改”。
我的问题是,body 是如何被篡改的?假设我们都在使用 HTTPS,黑客不需要破解 SSL 加密来修改 body 吗? Twilio 使用帐户身份验证令牌作为共享机密。但是,如果黑客能够打开一个请求 body 并对其进行篡改,他们是否能够在发送授权时获取 Auth Token?然后他们可以用他们获得的秘密来欺骗加密。
那么,为什么要经历另一层安全的麻烦,而不是让订阅者使用在 URL 路径中具有令牌的回调 URL。 URL 将与 body 一起加密。我看不出攻击者如何滥用这种方法。
谢谢!
共享秘密的目的是双方提前知道秘密,所以不发送(否则就不是秘密了)。使用您的 Twilio 示例,我检查了文档,它没有说明除签名之外的其他 headers,并且参数的 none 也是一个令牌,因此您提到的身份验证令牌不是包括。相反,两端都知道身份验证令牌,并且他们使用它来 generate/verify 签名。
如果有人要拦截和修改消息,他们需要知道秘密以重新签名消息才能使消息有效,除非一方泄露秘密,否则秘密将保持未知,任何修改的数据无法有效签名。如果传递了一个令牌,攻击者只需要拦截一个样本,然后就可以自由地使用有效令牌生成他们自己的消息。这显然不太安全。
至于 SSL,来源可以被欺骗,除非提供客户端证书(Twilio 不提供),否则无法确定是谁发送了请求,因此 SSL 本身不提供身份验证。
how could the body be tampered with?
不需要。您的服务器接受来自任何 body 的传入 HTTP(S) 请求。 HTTPS 不能保证发送者的真实性或身份,它只保证发送者和接收者可以在没有第三方拦截的情况下交换消息。
* 除了服务器证书外还可以使用客户端证书,因此 HTTPS 可以 验证身份两端相互连接;不幸的是,它很少在实践中使用,并且正确设置可能有些棘手。这就是为什么通常首选这种替代方案,因为它在实践中更容易实施。
所以 Webhook 中的 HMAC header 试图解决的问题是 验证发件人的身份 ,因为大概只有真实的发件人(Twilio 等) .) 会知道创建 HMAC 的秘密。它允许接收方完全忽略发送任意消息的随机第 3 方。
如果第 3 方拦截了请求,他们可以篡改 body,但他们无法生成新的正确 HMAC,因为他们无权访问秘密,因为秘密不是一部分请求的。
当然,另一种方法是将您希望从中接收 webhook 的一组 IP 地址列入白名单;但这对于发送服务来说是不方便的,因为他们不能根据需要自由分配他们的IP。它也有可能容易受到各种问题的影响,在这些问题中,攻击者可能能够(部分)控制 IP,而不会以其他方式对密钥造成安全漏洞。