一开始我误解了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/
(快速阅读?- 跳到下面的粗体部分)
为了防止被篡改的请求再次被使用(重放攻击),OAuth使用nonce和时间戳。Nonce一词意味着“仅使用一次的数字”(number used once),它是一个独特且通常是随机的字符串,旨在唯一标识每个签名请求。通过为每个请求提供唯一标识符,服务提供商能够防止请求被多次使用。这意味着消费者为发送到服务提供商的每个请求生成一个唯一的字符串,并且服务提供商跟踪所有已使用的nonce以防止它们再次使用。由于nonce值包含在签名中,攻击者无法更改它而不知道共享密钥。
使用nonce可能会给服务提供商带来很高的成本,因为他们需要永久存储所有接收到的nonce值。为了使实现更容易,OAuth向每个请求添加了一个时间戳值,这允许服务提供商仅保留有限时间内的nonce值。当一个请求带有一个比保留时间范围早的时间戳时,该请求将被拒绝,因为服务提供商不再拥有那个时间段的nonce。可以安全地假设,在允许的时间限制之后发送的请求是重放攻击。OAuth提供了一种通用机制来实现时间戳,但是将实际实现留给了每个服务提供商(许多人认为这是规范应该重新审视的领域)。从安全角度来看,真正的nonce是时间戳值和nonce字符串的组合。只有在一起,它们才能提供一个永久独特的值,攻击者永远无法再次使用。
我感到困惑的原因是如果Nonce只被使用一次,为什么服务提供商会基于时间戳拒绝请求?"服务提供商不再拥有那个时间段的nonce"对我来说是令人困惑的,并且听起来好像只要在30秒内,一个nonce可以被重复使用,只要在最后一次使用的时间之内。
所以有人能为我澄清这个问题吗?如果nonce只使用一次,而且我没有将时间戳与自己的系统时钟进行比较(因为这显然是不可靠的),那么时间戳的意义是什么?时间戳只相对于彼此,这似乎与唯一的nonce要求无关。