在基于摘要的认证中,nonce是由服务器生成的。然而,在基于OAuth的认证中,nonce是由客户端生成的。我想知道是否有人知道这种差异的原因?
Nonce(一次性数字)用于使请求唯一。在没有使用nonce的身份验证方案中,恶意客户端可以生成一个请求,然后多次重放该请求,即使计算代价很高。如果身份验证方案要求客户端为每个请求执行昂贵的计算,并使用nonce使请求唯一,那么回放攻击会被防止,因为它的速度从O(1)变为了O(N)。
具有客户端nonce的原因是为了防止恶意客户端进行回放攻击。
具有服务器nonce的原因是为了防止中间人攻击,以防攻击者捕获有效的服务器响应,并试图将其重放给客户端。
http://en.wikipedia.org/wiki/Cryptographic_nonce 上有关于如何使用nonce的良好解释和示意图。
http://en.wikipedia.org/wiki/Digest_access_authentication 上有一个关于nonce在现实世界中的使用示例。
首先,有时客户端确实会在摘要认证中提供一个nonce,但主要还是依赖于服务器(参见RFC2617)。
其次,因为如果你从握手的角度考虑认证过程,那么当你已经拥有一个令牌时,你已经完成了一半的握手,已经与服务器通信,所以你的下一步是使用你的服务请求联系服务器。这也需要通过nonce进行保护,因此你提供它。
或者,反之亦然。我已经有了令牌,那么为什么要联系服务器获取nonce,然后再用我的服务请求再次联系服务器呢?我可能会发出1000个服务请求,通过生成自己的nonce,可以减少2000位不必要的网络流量。