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 协议的完整指南
Maven 包签名或您如何信任/验证 Maven Central 工件的完整性和真实性?