简单来说,OAuth 2和OAuth 1有什么区别?
现在OAuth 1已经过时了吗?我们应该实施OAuth 2吗?我没有看到太多的OAuth 2实现;大多数人仍在使用OAuth 1,这让我怀疑OAuth 2是否可以使用。那它可用吗?
简单来说,OAuth 2和OAuth 1有什么区别?
现在OAuth 1已经过时了吗?我们应该实施OAuth 2吗?我没有看到太多的OAuth 2实现;大多数人仍在使用OAuth 1,这让我怀疑OAuth 2是否可以使用。那它可用吗?
OAuth 2.0不再要求客户端应用程序具备密码学功能。 这让人想起了旧的Twitter Auth API,它不需要应用程序对令牌和请求字符串进行HMAC哈希。使用OAuth 2.0,应用程序可以仅使用已发行的令牌通过HTTPS发送请求。
OAuth 2.0签名更简单。 不再需要特殊的解析、排序或编码。
OAuth 2.0访问令牌是“短期有效”的。 通常,OAuth 1.0访问令牌可以存储一年甚至更长时间(Twitter从不让其过期)。OAuth 2.0引入了刷新令牌的概念。虽然我不完全确定这些是什么,但我的猜测是您的访问令牌可以是短期有效的(即基于会话),而刷新令牌可以是“终身有效”的。您可以使用刷新令牌获取新的访问令牌,而无需用户重新授权您的应用程序。
最后,OAuth 2.0旨在在处理OAuth请求的服务器和处理用户授权的服务器之间实现清晰的角色分离。 关于此事的更多信息详见上述文章。
在我看来,之前的解释都过于详细和复杂了。简单来说,OAuth 2将安全性委托给HTTPS协议。而OAuth 1不需要这样做,因此必须采用替代方法来应对各种攻击。这些方法需要应用程序参与某些复杂的安全协议,实现起来可能很困难。因此,为了让应用程序开发人员不必担心安全问题,最简单的方法就是仅依靠HTTPS。
至于你的其他问题,答案取决于具体情况。有些服务不想要求使用HTTPS,而是在OAuth 2之前开发的,或者有其他要求使其无法使用OAuth 2。此外,关于OAuth 2协议本身已经有很多争议。正如你所看到的,Facebook、Google和其他一些公司都实现了略有不同的协议版本。因此,一些人坚持使用OAuth 1,因为它在不同平台上更加统一。最近,OAuth 2协议已经最终确定,但我们还没有看到它的采用情况。
OAuth 1.0协议(RFC 5849)的安全性建立在一个假设之上,即嵌入在客户端应用程序中的秘密密钥可以保持机密。然而,这个假设是幼稚的。
在OAuth 2.0(RFC 6749)中,这样一个幼稚的客户端应用程序被称为机密客户端。另一方面,在难以保持秘密密钥机密的环境中的客户端应用程序被称为公共客户端。有关详细信息,请参见2.1.客户端类型。
从这个意义上说,OAuth 1.0仅适用于机密客户端的规范。
"OAuth 2.0和通往地狱之路"认为OAuth 2.0不够安全,但在OAuth 1.0客户端和OAuth 2.0机密客户端之间的安全级别没有实际差异。OAuth 1.0需要计算签名,但如果已经确保客户端上的秘密密钥可以保持机密,则不会增强安全性。计算签名只是一种繁琐的计算,没有任何实际的安全增强。我的意思是,与OAuth 2.0客户端通过TLS连接到服务器并仅呈现client_id
和client_secret
的简单性相比,无法说繁琐的计算在安全方面更好。oauth_callback
参数可能成为一个安全漏洞。"OAuth 1.0安全性依赖于签名计算。签名是使用秘密密钥计算的,其中秘密密钥是用于HMAC-SHA1(RFC 5849, 3.4.2)或RSA-SHA1(RFC 5849, 3.4.3)的共享密钥或私钥。任何知道秘密密钥的人都可以计算签名。因此,如果秘密密钥被泄露,无论签名计算有多么复杂和逻辑化,其复杂性都没有意义。
这意味着OAuth 1.0安全性不是依赖于签名计算的复杂性和逻辑性,而仅仅依赖于秘密密钥的保密性。换句话说,OAuth 1.0安全所需的仅是秘密密钥可以保持机密的条件。这听起来可能很极端,但如果已经满足了该条件,则签名计算不会增加安全增强。
同样地,OAuth 2.0的机密客户端依赖于相同的条件。如果条件已经满足,那么使用TLS创建安全连接并通过安全连接将client_id
和client_secret
发送到授权服务器是否存在任何问题?如果两者都依赖于相同的条件,那么OAuth 1.0和OAuth 2.0机密客户端之间的安全级别是否有很大的区别?请注意,使用Oauth 2存在严重的安全争议:
请注意这些来自于Oauth 2的主要作者。
关键点:
Oauth 2在SSL之上没有提供额外的安全性,而Oauth 1是独立于传输的。
从某种意义上说,SSL并不安全,因为服务器不验证连接,常见的客户端库使忽略错误变得容易。
SSL/TLS的问题在于,当您在客户端未能验证证书时,连接仍然可以工作。任何时候,如果忽略错误会导致成功,开发人员都会这样做。服务器无法强制执行证书验证,即使它可以,攻击者也肯定不会这么做。
在OAuth 1.0中,您可以轻松地失误导致所有安全性丢失,而在OAuth 2.0中更难实现:
第二个常见的潜在问题是打字错误。如果省略一个字符(例如“https”中的“s”)就会使令牌的整个安全性无效,您认为这是一种适当的设计吗?或者将请求(通过有效和经过验证的SSL/TLS连接)发送到错误的目标(例如“http://gacebook.com”?)。请记住,能够从命令行使用OAuth承载令牌显然是承载令牌倡导者推广的用例。
一旦生成了令牌,实际的API调用不需要 OAuth 2.0 签名,它只有一个安全令牌。
OAuth 1.0 要求客户端在每个 API 调用时发送两个安全令牌,并使用两个令牌生成签名。它要求受保护资源终点点能够访问客户端凭据以验证请求。
这里 描述了 OAuth 1.0 和 2.0 的区别以及它们的工作方式。
OAuth 2显然是浪费时间(某位深度参与其中的人说):
https://gist.github.com/nckroy/dd2d4dfc86f7d13045ad715377b6a48f
他说(为简洁起见编辑并加粗强调):
...我不再能够与OAuth 2.0标准联系在一起了。我辞去了我的领导作者和编辑的角色,从规范中撤回了我的名字,并离开了工作组。将我辛苦劳作了三年,在两打草案中艰苦完成的文件中删除我的名字并不容易。决定放弃我已经领导了五年的努力是令人痛苦的。
...最后,我得出结论,OAuth 2.0是一个糟糕的协议。WS-*不好。它糟糕到我不想再与之相关联。...与OAuth 1.0相比,2.0规范更加复杂,互操作性更差,更少有用,更不完整,最重要的是,安全性更低。
明确一下,在深刻理解网络安全的开发人员的手中,OAuth 2.0可能会产生安全的实现。然而,在大多数开发人员手中 - 正如过去两年的经验所示 - 2.0很可能会产生不安全的实现。