身份验证中的nonce使用

19
在基于摘要的认证中,nonce是由服务器生成的。然而,在基于OAuth的认证中,nonce是由客户端生成的。我想知道是否有人知道这种差异的原因?
2个回答

44

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”吗?当服务器收到已经使用过的“nonce”时,请求是否应该被拒绝? - Simon
没有什么恶意客户端可以轻易做到的事情。这不是nonce所保护的场景。它们保护非恶意用户免受恶意窃听者重放其登录信息的攻击。 - Marcin

1

首先,有时客户端确实会在摘要认证中提供一个nonce,但主要还是依赖于服务器(参见RFC2617)。

其次,因为如果你从握手的角度考虑认证过程,那么当你已经拥有一个令牌时,你已经完成了一半的握手,已经与服务器通信,所以你的下一步是使用你的服务请求联系服务器。这也需要通过nonce进行保护,因此你提供它。

或者,反之亦然。我已经有了令牌,那么为什么要联系服务器获取nonce,然后再用我的服务请求再次联系服务器呢?我可能会发出1000个服务请求,通过生成自己的nonce,可以减少2000位不必要的网络流量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接