起初我误解了 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 是一次性使用,并且我没有将时间戳与我自己的系统时钟进行比较(因为这显然不可靠),那么时间戳的意义何在。时间戳只会相互关联是有道理的,但对于独特的随机数要求,它似乎无关紧要。