我对nonce有疑问。我理解这是为了防止重放攻击但是如果黑客以某种方式得到nonce并在用户之前使用它会发生什么?
答案 0 :(得分:46)
现时的目的是使每个请求都是唯一的,这样攻击者就无法在不同的上下文中重放请求。攻击者获取nonce并不重要:事实上,重点在于因为数据包含nonce,所以对攻击者没用。
<强> ADDED 强>:
一个随机数是由将其引入对话的一方随机生成的。至关重要的是攻击者不能影响nonce的选择,有时攻击者无法预测该选择。通常,每一方在分布式协议的运行中至少生成一次nonce。
存在nonce保密的协议。会话密钥既可以是随机数(即,由一个参与者随机选择)和秘密(即不直接通过网络传输)。实际上,在设计良好的协议中,会话密钥通常来自两个nonce的派生,一旦来自每一方。但保密并不是绅士的定义属性。
我们以authentication protocol on the wikipedia page为例。正常的操作顺序是:
snonce
发送回客户端。cnonce
,并将其凭据,服务器随机数和客户端现时(hash(snonce + cnonce + password)
)的哈希值发送到服务器。假设Mallory(攻击者)可以观察所有流量并发送自己的消息。如果她在第2步之后获取了nonce,她可以将自己的凭据发送到服务器。这可能有助于她导致拒绝服务,但无论如何,如果她可以注入流量,她也可以这样做。没有客户的凭据,她就无法冒充客户。
假设Mallory在步骤3中获取了客户端发送的数据包。由于凭据和随机数是经过哈希处理的,因此无法修改数据包,她只能将其作为一个整体再次发送。同样,根据服务器如何实现协议,她可能会导致拒绝服务,但不会更多。 (请注意,此协议要求服务器跟踪哪个nonce与哪个客户端关联,并在步骤4中响应该客户端。)步骤3中的散列操作使Mallory无法获取她不能获取的数据(客户端的密码)。
要了解服务器nonce存在的原因,假设它已丢失。然后,Mallory将能够获得包含hash(cnonce + passoword)
的数据包,稍后她可以在单独的连接中重新发送它,从而冒充客户端。
客户端nonce用于类似目的,尽管这在此处描述的简化协议中并不明显;在完整协议中,“令牌”将包含包含此随机数的数据散列,并且它将参与防止Mallory冒充服务器。
客户端现时还用于防止密码猜测攻击。假设Mallory在步骤2截获服务器的响应并替换她自己的服务器nonce。如果客户回复hash(snonce + password)
,这将使Mallory更容易运行大规模密码猜测攻击:她可以预先计算hash(snonce + x)
许多“易于猜测”的密码x
,然后运行她攻击许多客户端,希望密码较弱。这里客户端现时充当哈希密码的盐。
客户端随机数也有助于保护客户端免受严重实施的服务器的影响。假设服务器没有生成随机nonce,而是生成Mallory可以通过观察流量轻松找到的常量。然后,马洛里可以被动地执行前一段中描述的猜测攻击。因此,即使服务器未正确实现协议,客户端随机数也会为客户端提供额外的保护。类似地,服务器nonce为服务器提供了一些保护,以防止未正确生成其nonce的客户端,再次要求Mallory在她想要运行密码猜测攻击时主动攻击客户端。这是一种常见的情况:即使另一方偏离协议,每一方的nonce都会为该方提供一些保护。
答案 1 :(得分:2)
如果黑客获得了nonce并在用户之前使用它,则黑客获胜。 在某些情况下,黑客很难窃取一个nonce(通常是XSRF,nonce受同源策略的保护)。 因此,如果黑客可以窃取有效的随机数,则nonce无法保护您的用户。