32

这里接受的关于OAuth2 访问令牌为何过期的答案:

  • 许多提供商支持安全性非常弱的不记名令牌。通过使它们变得短暂并需要刷新,它们限制了攻击者滥用被盗令牌的时间。(这是什么意思?我认为它的意思是允许在没有 TLS 的情况下传输?还有别的吗?)。
  • 大规模部署不想在每次 API 调用时都执行数据库查找,因此他们会发布可通过解密验证的自编码访问令牌。但是,这也意味着无法撤销这些令牌,因此它们会在短时间内发行,并且必须刷新。
  • 刷新令牌需要客户端身份验证,这使其更强大。与上述访问令牌不同,它通常通过数据库查找来实现。

假设我们不支持访问令牌的非加密传输,则需要处理第一个要点。

假设我们可以针对可撤销的、完全随机的访问令牌进行数据库查找,从而处理第二个令牌。

对于移动应用来说,客户端认证不能再强了,因为“注册时获取的client_id和client_secret是嵌入到你的应用程序源代码中的,在这种情况下,client_secret显然不被视为秘密”。(谷歌)。这消除了第三个问题。

那么在这种情况下分离短期访问令牌和长期刷新令牌有什么好处呢?仅发布未过期的访问令牌并忽略整个刷新令牌部分是否“可以”?

4

3 回答 3

41

刷新令牌和未过期访问令牌在安全性方面的区别在于对授权服务器的额外调用。

如果攻击者获得了您未过期的访问令牌的访问权,他可以直接调用您的资源服务器并获取机密数据作为响应。
现在,如果他窃取了您的刷新令牌,他首先必须调用授权服务器并接收访问令牌作为响应。然后他可以向资源服务器查询机密数据。

每次使用刷新令牌从您的授权服务器请求访问令牌时,OAuth 2 规范(至少是目前的最新草案)都要求服务器检查客户端身份以及是否绑定到令牌(如果可能)。

由于使用客户端密码的常规方法无法明确识别开放平台上已安装的应用程序,因此运行应用程序的平台必须提供执行此操作的方法。例如,Google 要求开发者对 Android 应用程序进行签名。因此,当使用Google API 控制台为 Android 应用程序请求凭据时,您必须指定用于对应用程序进行签名的证书的指纹,并且仅获取客户端 ID,但没有秘密响应。在发行令牌时,Google 可以决定应用程序是否已获得开发人员的授权,以他的名义请求令牌。

如果您确实无法验证客户端身份,那么至少在某些情况下可以识别出刷新令牌被盗。该规范有一个例子

当客户端身份验证不可行时,授权服务器应该部署其他方法来检测刷新令牌滥用。

例如,授权服务器可以使用刷新令牌轮换,其中每次访问令牌刷新响应都会发布一个新的刷新令牌。先前的刷新令牌已失效,但由授权服务器保留。如果刷新令牌被破坏并随后被攻击者和合法客户端使用,它们中的一个将呈现一个无效的刷新令牌,这将通知授权服务器违规行为。

于 2012-07-16T22:09:26.143 回答
6

未过期的访问令牌的最大问题是没有机制来替换被盗的令牌。如果我可以访问您的未过期访问令牌,那么我实际上就是该系统的您。如果令牌是短暂的并且过期了,那么有一种机制可以替换被盗的令牌,并且限制了我必须破解您的令牌的窗口。

假设我需要 3 个小时来破解一个数据包并获取令牌,但访问令牌只有两个小时有效。然后,当我无法侵入您的帐户时,令牌已更改,我必须重新开始。如果令牌没有过期,那么我可以完全访问您的帐户,您无法替换它,除非删除令牌并强制重新授权。

于 2012-07-13T16:07:49.467 回答
0

OAuth2 访问令牌不必过期(或者更确切地说,它们确实会过期,但可能会过期很多年)。

访问令牌可以一次用于从资源服务器获取某些资源,特别是它允许获取用户批准的那些资源。另一方面,刷新令牌允许重复访问。因此,如果不要求每次访问之间的用户交互,就无法取消刷新令牌。

但总的来说,令牌有时会被同一设备上的其他恶意应用程序或手机上的 MITM 攻击窃取。如果可以使电话信任不可靠的证书,则 SSL 是 MITM-able。公司有时需要这样做才能访问内部网络(他们需要接受自签名证书,这允许他们对公司网络上发生的所有加密流量进行 MITM。因此假设发送加密令牌意味着它们在途中不会被盗是危险的。

不记名令牌本身并不比任何其他形式的令牌弱,正如一堆论文中所证明的那样(包括我自己的一篇,当我可以挖掘出来时,我会发布链接。)但是,不记名令牌只是适用于他们做出的假设有效的情况。令牌可以保密的假设通常是不记名令牌的主要假设。如果这不是真的,那么不记名令牌不会声明任何安全属性(尽管有些仍然持有)。请参阅NIST Level 3 tokens,它定义了承载令牌必须击败的攻击,如OAuth Bearer Tokens中所述。简而言之,不记名令牌不应该阻止令牌被盗。

不记名令牌不能被撤销,这是真的。然而,鉴于通常的访问模式是在获取后立即使用访问令牌,因此即使当前无法想到滥用案例,也应该相当快地使访问令牌过期以防止潜在的滥用。代币存在的时间越长,被盗的可能性就越大。刷新令牌实际上被盗更危险,因为如果您无法保护客户端 ID,它会在更长的时间范围内提供重复访问。OAuth2 通常可以提供对资源的访问,因此例如可以用于将 API 公开给客户端一段时间。与单次使用令牌相比,使用刷新令牌可以造成更大的伤害。

事实上,客户端身份验证可以通过多种方式变得更加安全,例如,在下载时为每个客户端提供不同的密钥。这可以防止在一个设备上对令牌进行逆向工程破坏客户端所有实例的安全性的普遍攻击。其他可能的技术包括使用 OAuth 向您的服务器验证客户端,然后使用您希望访问的授权服务器执行 OAuth 协议的第二次运行。这样,您就可以让客户端定期更新其密钥,并让它们都拥有不同的密钥,同时不会对 Facebook 或 Google 拥有的授权服务器所使用的系统造成过度负担。

使用移动应用程序时,长期刷新令牌比拥有某种多用途不记名令牌更安全,即使没有采取措施保护客户端。这是因为用户不能使令牌过期。如果刷新令牌没有被盗,并且用户只是希望撤销访问,那么可以这样做。即使用户只是希望撤销访问权限,也不能撤销多用途不记名令牌。多用途数据库引用令牌显然可以被撤销,但这不是协议的设计目的,因此在 OAuth 上执行的安全分析并没有说明这个混合系统的安全性。

总之,我建议使用刷新令牌和数据库令牌,因为这最有可能是安全的。如果您可以做任何事情来保护客户,那将是一个额外的好处,但是这可以防止的情况很少。如果您确实想保护客户端,请考虑使用软令牌,即谷歌身份验证器,因为这是一个可靠的实现,经受住了一些非常聪明的人的分析。

于 2012-07-19T13:44:38.660 回答