当前位置: 首页 > 知识库问答 >
问题:

为什么webhook实现会避免基于令牌的安全性?

陈宏胜
2023-03-14

在研究了各种webhook实现之后,我注意到它们使用的安全机制有一种趋势。

Visual Studio Team Services Webhook使用基本身份验证。

微软图形网络钩子在每个网络钩子调用的正文中发送一个明文“clientState”。接收器根据已知值验证clientState。这与基本身份验证类似,因为每个请求都通过线路发送明文凭据。

Slack outgoing Webhook使用了一种与Microsoft Graph非常相似的技术:在每个请求的主体中发送一个明文“令牌”。接收方根据已知值验证令牌。同样,与基本身份验证非常相似:每次请求都会通过网络发送明文凭证。

在上述所有示例中,凭据永远不会过期。此外,每个钩子只有一个“令牌”值,这意味着如果令牌受损,就无法优雅地旋转它。

我对基本身份验证的理解是,通常避免使用它,因为它要求客户端以明文形式存储凭据,这是一种安全风险。

接下来,Github和Box网络钩子使用共享的秘密和签名进行身份验证。

网络钩子使用的安全机制与其各自的应用编程接口使用的安全机制形成对比——它们都使用OAuth 2.0和JWT承载令牌。

我还没有看到使用基于令牌的身份验证的webhook实现——例如,在授权头中发送JWT承载令牌的平台。

我的问题是:webhook实现趋向于基本身份验证等不太安全的机制的原因是什么?他们为什么不像自己的API那样使用OAuth 2.0和JWT呢?

共有1个答案

张砚
2023-03-14

基于令牌的认证系统并不意味着JWT是令牌格式。

如果选择Slack或MS Graph实现,并使用承载方案将clientState/令牌从请求主体移动到授权头,则不会发现显著差异的确,报头将是传递用于验证请求的信息的最合适的方式,服务器可能会以比请求体更安全的方式处理报头。。。但是,为了讨论这个问题,我们可以忽略这一点

令牌将是一个引用令牌,其中实际值是无意义的,有效性和任何相关信息是由消费者从独立存储中获得的。在这种情况下,有效性的判断纯粹是通过确保令牌符合您期望的值,并且没有与令牌关联存储的额外信息,但这仍然是一个基于无记名令牌的身份验证系统,在这个意义上,任何拥有令牌的人都可以请求。此外,令牌不是通过任何OAuth 2.0流获得的,但对于像这样的场景来说,这将是过度的。

Github实现将被归类为对纯承载实现的改进,因为没有令牌在线路上移动,只有有效负载的签名,这意味着能够解密通信通道的攻击者只能重放捕获的请求,而不能发出具有不同有效负载的请求。

您可能找不到使用功能齐全的OAuth 2.0 plus JWT作为令牌格式的webhooks实现,因为这对于手头的用例来说是一种过分的杀伤力。

更新:

JWT的到期时间是您希望它是什么样子的,就像它是引用令牌(您称之为简单令牌)的到期时间一样。

我试图传递的信息是,您不需要JWT或OAuth来拥有基于令牌的身份验证系统。基于令牌的系统的安全特性可以独立于所使用的令牌格式来设计;是的,有些格式会简化某些方面,同时可能会使其他方面更加复杂。这总是一个权衡...

在这样一个系统中,你只想确保打电话的人是你信任的人,而不仅仅是一个完全陌生的人,JWT似乎有些过分;这当然是我的观点。

简单的标记本身就是秘密,这取决于你所说的秘密的确切含义。承载身份验证方案中使用的JWT或by引用令牌如果泄露,会给出完全相同的结果。任何拥有令牌的人都可以在令牌有效时发出请求。如果您指的是用于对JWT进行签名的密钥/密钥,而JWT不是通过有线传输的,那么如果您使用的是通过引用进行签名的令牌,这也是完全相同的。

同样,对你潜在问题的诚实回答是,考虑到系统的威胁模型,这些系统添加了他们认为值得的安全机制。就个人而言,我并不反对不使用OAuth 2.0 plus JWT,因为在那个用例中它似乎完全不值得。我倾向于使用Github方法。

您可能不喜欢它们提供的安全特性,但MS Graph和Slack方法都是使用承载令牌的基于令牌的系统。

 类似资料:
  • 我正在阅读 Auth0 站点上有关刷新令牌和 SPA 的文档,他们指出 SPA 不应使用刷新令牌,因为它们无法安全地存储在浏览器中,而是使用静默身份验证来检索新的访问令牌。 单页应用程序(通常实施 我很困惑。据我了解,检索新访问令牌的唯一方法是向身份验证服务器提交新请求,以及某种形式的 Auth0 会话 cookie,以对登录的用户进行身份验证。收到会话 cookie 后,Auth0 服务器将能够

  • 问题内容: 通常我会尽可能避免转换类型,因为我认为这是不良的编码实践,并且可能会导致性能下降。 但是,如果有人要我解释为什么会这样,我可能会像前灯中的鹿一样看它们。 那么,为什么/何时铸造不好? 它对于Java,C#,C ++是通用的,还是每个不同的运行时环境都按照自己的方式处理? 欢迎使用任何语言的细节,例如为什么在c ++中不好? 问题答案: 您已经用三种语言标记了这三种语言,答案在三种语言之

  • 问题内容: 假设我们在页面上有一个DIV ,并且想要将该DIV的内容复制(“复制粘贴”)到另一个DIV中。我们可以这样做: 或使用jQuery: 但是,看来此方法不是一个好主意,应避免使用。 (1)为什么要避免这种方法? (2)应该怎么做呢? 更新: 为了解决这个问题,我们假设DIV中没有ID为ID的元素。 (对不起,我忘了在原始问题中介绍此案。) 结论: 我已经在下面发布了我对这个问题的答案(如

  • 在React中,我尝试了两种方法: 然后更改状态this.setState(this.state) 克隆状态,更改状态克隆,然后更改此.setState(stateClone) 它们都起作用,产生相同的结果。为什么建议(在文档中)设置为状态克隆(使用Object.assign),而不是设置为状态本身?状态的对象标识在React中重要吗(没有Redux)?似乎只要调用setState,不管状态对象标

  • 我的公司不允许使用Mockito。在单元测试中验证。甚至有一个定制的声纳规则 规则如下 应该通过断言来验证结果,而不是使用“验证到执行”过程验证。因为如果我们验证流程,在流程更改后需要更多的努力来维护测试,但输入和输出保持不变。确保每一行代码都对结果有影响,并断言结果以证明逻辑正确 不合规代码示例 合规解决方案 对于数据库或中间件操作,断言使用嵌入式数据库或中间件成功写入数据。 对于restful

  • 我正在构建一个基于令牌的身份验证(Node.js使用带有angular客户端的passport/JWT)。 用户输入凭证后,他将获得一个访问令牌,并在头中的每个请求中发送该令牌(头:bearer token)。 我不想每次他的访问令牌过期时都提示登录请求(我猜大约每天),我听说过刷新令牌。刷新令牌永不过期(或很少过期),并且能够无限期续订令牌。当访问令牌即将过期时,客户端可以通过发送刷新令牌来发送