Oauth 2 - params排序和签名完整性

时间:2012-03-05 11:20:14

标签: oauth-2.0

我有两个问题:

Q1:为什么OAuth2要求对序列进行排序和编码(对于双腿)?

所有它必须担心的是给定数据(查询字符串)的最终匹配签名。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

Q1:订购查询参数为HMAC带来了理智。

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

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

您有一个密钥,只有您和服务器知道它。此密钥签署请求。如果HMAC根据此密钥不匹配,则请求失败。

由于所有参数都已用于创建HMAC,因此请求对MITM攻击是安全的 - 黑客无法更改,添加或删除任何查询参数,或者服务器在尝试授权时会生成不同的HMAC请求失败。