Oauth 2 - 参数排序和签名完整性

Posted

技术标签:

【中文标题】Oauth 2 - 参数排序和签名完整性【英文标题】:Oauth 2 - params ordering and signature integrity 【发布时间】:2012-03-22 20:55:02 【问题描述】:

我有两个问题:

Q1:为什么 OAuth2 需要对参数进行排序和编码(对于 2-legged)?

它只需要担心给定数据(查询字符串)两端的匹配签名。

我们可以只检查使用查询字符串生成的签名。(例如 ?a=1&b=2)。由于签名是基于只有客户端和提供者知道的密钥生成的,所以我们只能考虑查询字符串而无需任何排序/编码。

那么,进行排序/编码然后创建签名有什么好处?

Q2:这个签名如何让我免于中间人攻击?

如果我必须从客户端向我的服务器发出这样的请求:

increaseUserPoints?userId=1&pointsToAdd=5&appId=x&token=XYZ

现在令牌 XYZ 将始终相同,因此黑客可以继续发布相同的请求以增加 points。由于从给定的appId 生成的令牌是相同的,服务器将允许这样做。这个案子是怎么处理的?

【问题讨论】:

为什么这个标签是 oauth-2 而你在讨论 HMAC? 【参考方案1】:

Q1:对查询参数进行排序可以使 HMAC 更加健全。

假设您有两个参数:“pointsToAdd”和“appId”。使用查询字符串 pointsToAdd=X&appID=y 创建与 appID=y&pointsToAdd=X 不同的 HMAC。因为您和服务器都需要生成相同的 HMAC 来验证具有无序查询参数的请求纯失败。

Q2:这可以使您免受攻击,因为只有您和服务器知道如何签署您的请求。

你有一个密钥,只有你和服务器知道。此密钥对请求进行签名。如果 HMAC 根据此密钥不匹配,则请求失败。

由于所有参数都已用于创建 HMAC,因此请求可以免受 MITM 攻击 - 黑客无法更改、添加或删除任何查询参数,否则服务器在尝试授权时会生成不同的 HMAC,并且请求失败。

【讨论】:

重放攻击呢?除非时间戳被用作生成令牌的组件,否则服务器将重播它。

以上是关于Oauth 2 - 参数排序和签名完整性的主要内容,如果未能解决你的问题,请参考以下文章

OAuth 2.0 与 OpenID Connect 协议的完整指南

对 HTTP 请求进行身份验证和签名

加密第三节_数字签名和数字证书

Maven 包签名或您如何信任/验证 Maven Central 工件的完整性和真实性?

添加 Flickr API 参数时的 oAuth “无效签名”

使用.sig签名验证文件