我一开始误解了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和timestamp.术语nonce表示"一次使用的数字",是一个唯一且通常是随机的字符串,用于唯一标识每个已签名的请求.通过为每个请求提供唯一标识符,服务提供商可以防止多次使用请求.这意味着Consumer为发送给服务提供者的每个请求生成唯一字符串,并且服务提供者跟踪用于防止它们第二次被使用的所有nonce.由于nonce值包含在签名中,因此攻击者无法在不知道共享密钥的情况下更改它.
使用nonce对于服务提供商而言可能非常昂贵,因为他们要求永久存储所有收到的nonce值.为了简化实现,OAuth为每个请求添加了一个时间戳值,允许服务提供者仅在有限的时间内保留nonce值.当请求的时间戳早于保留的时间范围时,它将被拒绝,因为服务提供商不再具有该时间段的随机数.可以安全地假设在允许的时间限制之后发送的请求是重放攻击.OAuth提供了一种实现时间戳的通用机制,但实际实现只留给每个服务提供者(许多人认为应该由规范重新访问).从安全角度来看,真正的nonce是timestamp值和nonce字符串的组合.只有它们一起提供永久的唯一值,攻击者永远不能再使用它.
我感到困惑的原因是,如果Nonce仅使用一次,为什么服务提供商会根据时间戳拒绝?"服务提供商不再具有该时间段内的随机数"对我来说很困惑,并且听起来好像只能在上次使用时间的 30秒内重新使用该随机数.
所以有人可以为我清除这个吗?如果nonce是一次性使用而且我没有将时间戳与我自己的系统时钟进行比较(因为这显然不可靠),时间戳的重点是什么.有意义的是,时间戳只相对于彼此,但是由于具有独特的随机数要求,它似乎无关紧要.
有人可以分享在Python中为OAuth请求创建nonce的最佳实践吗?