OAuth 1.0 协议 (RFC 5849) 的安全性依赖于嵌入在客户端应用程序中的密钥可以保密的假设。但是,这种假设是幼稚的。
在 OAuth 2.0 (RFC 6749) 中,这种天真的客户端应用程序被称为 机密 客户端。另一方面,在难以保密密钥的环境中的客户端应用程序称为公共客户端。详情请见2.1. Client Types。
从这个意义上说,OAuth 1.0 是仅适用于机密客户端的规范。
“OAuth 2.0 and the Road to Hell”表示 OAuth 2.0 的安全性较低,但 OAuth 1.0 客户端和 OAuth 2.0 机密客户端之间的安全级别没有实际差异。 OAuth 1.0 需要计算签名,但如果已经确定客户端的密钥可以保密,则不会增强安全性。计算签名只是一个繁琐的计算,没有任何实际的安全增强。我的意思是,相比于 OAuth 2.0 客户端通过 TLS 连接到服务器并仅呈现 client_id 和 client_secret 的简单性,不能说繁琐的计算在安全性方面更好。
此外,RFC 5849 (OAuth 1.0) 没有提及任何关于 open redirectors 的内容,而 RFC 6749 (OAuth 2.0) 则有。也就是说,OAuth 1.0 的oauth_callback 参数可能会成为一个安全漏洞。
因此,我认为 OAuth 1.0 并不比 OAuth 2.0 更安全。
[2016 年 4 月 14 日] 补充说明我的观点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 1.0 归咎于 OAuth 2.0 的充分理由。事实很简单,(1) OAuth 1.0 只是一个仅适用于机密客户端的规范,(2) OAuth 2.0 简化了机密客户端的协议并支持 public 客户端。不管它是否广为人知,智能手机应用程序都被归类为公共客户端 (RFC 6749, 9),它们受益于 OAuth 2.0。