我有两个问题:
Q1:为什么OAuth2要求对序列进行排序和编码(对于2脚)?
所有它必须担心的是给定数据(查询字符串)的最终匹配签名.
我们可以检查使用查询字符串生成的签名(例如?a = 1&b = 2).由于签名是基于客户端和提供者只知道的密钥生成的,因此我们只能考虑没有任何排序/编码的查询字符串.
那么,在进行排序/编码然后创建签名时有什么好处?
Q2:这个签名怎么能让我免受中间人攻击?
如果我必须从客户端向我的服务器发出这样的请求:
increaseUserPoints?userId=1&pointsToAdd=5&appId=x&token=XYZ
Run Code Online (Sandbox Code Playgroud)
现在令牌XYZ将始终相同,因此黑客可以继续发布相同的请求以增加points
.由于来自给定的生成令牌appId
是相同的,服务器将允许这样做.这个案子是如何处理的?
假设你有两个参数:'pointsToAdd'和'appId'.使用查询字符串可pointsToAdd=X&appID=y
创建不同的HMAC appID=y&pointsToAdd=X
.因为您和服务器都需要生成相同的HMAC来验证具有无序查询参数的请求.
你有一个密钥,只有你和服务器知道它.此密钥签署请求.如果HMAC根据此密钥不匹配,则请求失败.
由于所有参数都已用于创建HMAC,因此请求对MITM攻击是安全的 - 黑客无法更改,添加或删除任何查询参数,或者服务器在尝试授权且请求失败时将生成不同的HMAC.
归档时间: |
|
查看次数: |
2445 次 |
最近记录: |