41

起初我误解了 OAuth 的时间戳实现,认为这意味着时间戳不在当前时间后 30 秒内将被拒绝,结果证明这是错误的,原因包括我们无法保证无论时区如何,每个系统时钟都足够同步到分钟和秒。然后我又读了一遍以获得更清晰的信息:

“除非服务提供商另有规定,否则时间戳以自 1970 年 1 月 1 日 00:00:00 GMT 以来的秒数表示。时间戳值必须是正整数,并且必须等于或大于前面使用的时间戳请求。”

来源: http: //oauth.net/core/1.0/#nonce

这意味着时间戳仅与来自同一源的先前请求进行比较,而不是与我的服务器系统时钟进行比较。

然后我在这里阅读了更详细的描述:http: //hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/

TL;DR? - 跳到下面的粗体部分)

为防止再次使用(重放)受损请求,OAuth 使用随机数和时间戳。术语 nonce 表示“使用一次的数字”,是一个唯一且通常是随机的字符串,用于唯一标识每个签名请求。通过为每个请求设置一个唯一标识符,服务提供者能够防止请求被多次使用。这意味着消费者为发送给服务提供者的每个请求生成一个唯一的字符串,服务提供者跟踪所有用于防止它们被第二次使用的随机数。由于 nonce 值包含在签名中,因此攻击者无法在不知道共享秘密的情况下更改它。

对于服务提供商来说,使用 nonce 的成本可能非常高,因为他们需要永久存储收到的所有 nonce 值。为了使实施更容易,OAuth 为每个请求添加了一个时间戳值,这允许服务提供者仅在有限的时间内保留 nonce 值。当请求的时间戳早于保留的时间范围时,它会被拒绝,因为服务提供者不再具有该时间段的随机数。可以安全地假设在允许的时间限制之后发送的请求是重放攻击。OAuth 提供了实现时间戳的通用机制,但将实际实现留给每个服务提供者(许多人认为规范应该重新审视这一领域)。从安全的角度来看,真正的 nonce 是时间戳值和 nonce 字符串的组合。只有将它们结合在一起才能提供永远不会被攻击者再次使用的独特价值。

我感到困惑的原因是,如果 Nonce 只使用一次,为什么服务提供商会根据时间戳拒绝?“服务提供商不再拥有该时间段的随机数”让我感到困惑,听起来好像可以重复使用随机数,只要它在最后一次使用的 30 秒内。

那么任何人都可以为我解决这个问题吗?如果 nonce 是一次性使用,并且我没有将时间戳与我自己的系统时钟进行比较(因为这显然不可靠),那么时间戳的意义何在。时间戳只会相互关联是有道理的,但对于独特的随机数要求,它似乎无关紧要。

4

4 回答 4

38

时间戳用于允许服务器优化它们的 nonce 存储。基本上,将读取的 nonce 视为时间戳和随机字符串的组合。但是通过拥有一个单独的时间戳组件,服务器可以使用一个短窗口(比如 15 分钟)实现基于时间的限制,并限制它需要的存储量。如果没有时间戳,服务器将需要无限的存储空间来保存每一个使用过的 nonce。

假设您决定允许您的时钟与客户的时钟之间存在最多 15 分钟的时差,并且正在跟踪数据库表中的 nonce 值。该表的唯一键将是“客户端标识符”、“访问令牌”、“随机数”和“时间戳”的组合。当有新请求进来时,检查时间戳是否在时钟的 15 分钟内,然后在表中查找该组合。如果找到,拒绝呼叫,否则将其添加到您的表中并返回请求的资源。每次向表中添加新的 nonce 时,请删除时间戳超过 15 分钟的“客户端标识符”和“访问令牌”组合的任何记录。

于 2011-07-29T17:42:00.287 回答
8

好的,经过足够的思考,我相信我已经破解了这个。

他们希望我始终知道最后一次成功请求的时间戳,这样如果在此之前出现任何时间戳,它将被忽略。

此外,Nonce 必须是唯一的,但我只会将它们存储到某个日期范围内,因此如果时间戳记这么多小时,Nonce 将被删除,然后可以再次使用,但是因为最后使用的时间戳是也被存储,即使 Nonce 被认为是唯一的,它们也不能重用旧请求,因为该请求上的时间戳会过时。

然而,这只适用于签名。如果他们更改了请求的时间戳或 Nonce,则签名将不再与请求匹配并且将被拒绝(因为时间戳和 Nonce 都是签名创建的一部分,并且它们没有签名密钥)。

呸!

于 2011-07-29T13:38:51.377 回答
0

如果 OAuth 只使用时间戳,攻击者就比较容易猜出下一个时间戳是什么,并将他们自己的请求注入到进程中。他们只需要做“以前的时间戳+ 1”。

通过使用以加密安全方式生成的随机数(希望如此),攻击者不能简单地注入 TS+1,因为他们没有适当的随机数来验证自己的身份。

将其视为需要钥匙卡和密码的安全门锁。你可以偷钥匙卡,但仍然无法通过门,因为你不知道密码。

于 2011-07-28T21:13:41.127 回答
-1

可以合理地假设人们可以尝试用蛮力破解随机数。时间戳减少了某人可能成功的机会。

于 2017-01-03T20:30:34.950 回答