移动应用的OAuth2访问令牌是否必须过期?

34

这里关于为什么OAuth2访问令牌会过期的接受答案是:

  • 许多提供程序支持弱安全性的承载令牌。通过使它们短暂并要求刷新,限制攻击者滥用窃取的令牌的时间。(这是什么意思?我理解为允许不使用TLS进行传输?还有其他吗?)。
  • 大规模部署不希望在每个API调用时执行数据库查找,因此他们发行自编码的访问令牌,可以通过解密进行验证。然而,这也意味着没有办法撤销这些令牌,因此必须短暂并需要刷新。
  • 刷新令牌需要客户端身份验证,使其更加安全。与上述访问令牌不同,它通常是通过数据库查找实现的。

假设我们不支持未加密传输访问令牌,就可以解决第一点。

假设我们可以对可撤销,完全随机的访问令牌执行数据库查找,就可以解决第二点。

对于移动应用,客户端认证无法更加强大,因为“在注册期间获得的client_id和client_secret被嵌入到应用程序的源代码中。在这种情况下,client_secret显然不被视为机密。”(Google)。这消除了第三个问题。
那么,在这种情况下,将短期访问令牌和长期刷新令牌分开有什么好处呢?是否“可以”只发行永不过期的访问令牌并忽略整个刷新令牌部分?
3个回答

44
在安全方面,刷新令牌和永久访问令牌之间的区别是需要向授权服务器发出额外的调用。
如果攻击者获取了您的永久访问令牌,他可以直接调用您的资源服务器并获取机密数据作为响应。现在,如果他窃取了您的刷新令牌,那么他首先必须调用授权服务器并接收一个访问令牌作为响应,然后才能查询资源服务器以获取机密数据。每次使用刷新令牌从授权服务器请求访问令牌时,至少最新草案的OAuth 2规范要求服务器检查客户端身份和是否与令牌绑定(如可行)。由于使用客户端密钥的常规方法无法确定开放平台上安装的应用程序的身份,因此运行应用程序的平台必须提供方法来实现这一点。例如,谷歌要求Android应用程序由开发人员签名。当使用Google API控制台为Android应用程序请求凭据时,您必须指定所用于签署应用程序的证书的指纹,并仅在响应中获取客户端ID而不是密钥。在发放令牌时,谷歌可以决定该应用程序是否被开发者授权以在其名义请求令牌。如果您无法验证客户端身份,则在某些情况下至少可以识别刷新令牌被盗的情况。规范提供了一个例子来说明这一点:“当无法进行客户端身份验证时,授权服务器应部署其他手段来检测刷新令牌的滥用。”

例如,授权服务器可以采用刷新令牌轮换的方式,在每次访问令牌刷新响应中颁发新的刷新令牌。之前的刷新令牌将被作废但保留在授权服务器中。如果刷新令牌被破解并且随后由攻击者和合法客户端使用,其中一个人将提供一个作废的刷新令牌,这将通知授权服务器存在安全漏洞。


在发放令牌时,谷歌可以决定应用程序是否已获得开发者授权以其名义请求令牌。他们是如何做到的呢?Android操作系统是否以某种方式位于应用程序和网络之间,并证明该应用程序已正确签名? - Thilo
2
在Android中,您可以使用AccountManager类来处理令牌和授权,Google的服务已经内置在其中。我认为他们还没有使用应用签名检查,而是采用了客户端凭据方法。应用签名检查是在由Yaniv Inbar主持的2012年Google I/O演讲中宣布的,有趣的部分是在10:41 - Jan Gerlinger
该项目名为Google Play服务 - Jan Gerlinger
1
请查看此处建议的代码,以从代码内部检索您的Android证书指纹,以进行客户端验证:https://dev59.com/32ox5IYBdhLWcg3wTina - Alon Burg
有趣的回答,如果SSL关闭了,但是它是开启的,所以我在“如果攻击者获得访问权限”这一点上失去了你。这太过了。在我开始相信这个教条之前,我需要一个好理由。 - lapin
1
@lapin SSL/TLS只保护令牌在传输过程中的安全。攻击者可以通过许多其他方式获得访问权限,例如实现错误、不当存储或设备上的根漏洞利用等。这一切都是关于为您的分层防御添加更多层次。 - Jan Gerlinger

7
非过期的访问令牌最大的问题在于没有机制可以替换被盗的令牌。如果我获取了你的非过期的访问令牌,那么在那个系统中我就能够代表你。如果令牌是短暂的并且过期,那么就有机制可以替换被盗的令牌,并且窗口时间也有限制。

假设我需要3小时来破解数据包并获取令牌,但是访问令牌只能用两个小时。然后,在我成功地进入你的帐户之前,令牌已经更改了,我必须从头开始。如果令牌是非过期的,则我完全可以访问你的帐户,而你却没有任何办法可以替换它,除非删除令牌并强制重新授权。


6
那么这个问题是否也适用于刷新令牌呢?刷新令牌与访问令牌的发放、存储和使用方式相同,并且不会很快过期,那么安全性增强在哪里呢?这个长时间有效的刷新令牌不完全破坏了将访问令牌设置为短期有效的好处吗? - Thilo
2
刷新令牌仅用于获取新的访问令牌,因此暴露的风险较小。刷新令牌仅在 SSL 加密消息的正文中发送,而不是在头部中发送。刷新令牌还需要 client_id 和 client_secret 进行额外的身份验证。因此,与访问令牌相比,刷新令牌泄漏的风险更小。 - Mark S.
1
在这个问题中,我已经假设只使用SSL。此外,在移动设备流程中,client_id和client_secret是公共信息。老实说,我无法看出在这种情况下刷新令牌比访问令牌更安全(除了可能每30分钟使用一次而不是每30秒)。 - Thilo
如果我获得了您的永不过期的访问令牌,那么您就不会获取它,因为SSL已经启用。所以从那一点开始的任何进一步讨论都是无意义的。 - lapin

0

OAuth2访问令牌不必过期(或者说它们确实会过期,但可能是多年以后)。

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

总的来说,令牌有时可能会被同一设备上的其他恶意应用程序或手机上的中间人攻击窃取。如果可以使手机信任一个可疑证书,则SSL是可中间人攻击的。这有时是公司访问内部网络所需的(它们要求接受自签名证书,这使它们能够中间人攻击公司网络上发生的所有加密流量)。因此,假设发送加密令牌意味着它们在途中无法被窃取是危险的。

Bearer令牌本身并不比其他任何形式的令牌弱,这在一些论文中已经得到证明(包括我自己的一篇,我会在找到链接后发布)。然而,在仅当它们所做出的假设是有效的情况下,Bearer令牌才是合适的。通常,Bearer令牌的一个主要假设是令牌可以保密。如果这不是真的,则Bearer令牌不会断言任何安全属性(尽管有些仍然保持)。请参见NIST Level 3 tokens,其中定义了Bearer令牌必须击败的攻击,如OAuth Bearer Tokens所指定的那样。简而言之,Bearer令牌不应该打败令牌的盗窃。

Bearer令牌无法被撤销,这是事实。然而,考虑到访问的通常模式是在获取后立即使用访问令牌,应该相当快地过期访问令牌以防止潜在的滥用,即使当前无法想出滥用案例。令牌存在的时间越长,被盗的可能性就越大。刷新令牌实际上更容易被盗窃,因为它提供了在更长时间范围内重复访问的机会,如果您无法保护客户端ID。OAuth2可以提供对资源的访问,例如可以用于向客户端暴露API一段时间。与单次使用令牌相比,使用刷新令牌可以造成更多的损害。

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

在使用移动应用程序时,长期有效的刷新令牌比具有某种多次使用的承载令牌更安全,即使用户没有采取保护客户端的措施。这是因为用户无法使令牌过期。如果未窃取刷新令牌,并且用户仅希望撤销访问权限,则可以执行此操作。即使用户仅希望撤销访问权限,多次使用的承载令牌也无法被撤销。显然,多次使用的数据库引用令牌可以被撤销,但这不是协议的设计目的,因此对OAuth进行的安全性分析并未涉及此混合系统的安全性。

总之,我建议使用刷新令牌和数据库令牌,因为这是最可能安全的。如果您可以采取任何措施来保护客户端,那就是额外的奖励,但是这种保护所针对的情况很少。如果您确实想要保护客户端,请考虑软令牌(例如Google Authenticator),因为这是一个经受了一些非常聪明的人分析的可靠实现。


“访问令牌只能使用一次”:你有相关链接吗?我的理解是,它可以在过期之前无限次数地使用。 - Thilo
"Bearer tokens不能被撤销,这是事实。":为什么?如果token由数据库中的条目支持,您可以删除该条目。 - Thilo
令牌持有人,根据定义,包含了访问资源服务器所需的所有信息,而无需检查数据库。这就是令牌持有人的目的,它就像一张银行票据,仅凭持有即可使用,无需进一步身份验证。如果您正在对数据库进行检查,则不再是令牌持有人。访问令牌只能使用一次的事实可以从其包含一个nonce或单次使用值中得出。一些当前的实现没有检查这一点,但从技术上讲,它们不符合规范。 - jhoyla
你如何在没有数据库的情况下检查单次使用的值?难道不需要存储已经看过的nonce吗? - Thilo
使用MAC意味着不使用承载令牌。 Nonce仅在OAuth2规范中作为MAC示例的一部分提到。 - Thilo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接