Skip to content

Nonce 简介

1. Nonce 与信息安全

在信息安全中,Nonce 是一个在加密通信只能使用一次的数字。在认证协议中,它往往是一个随机或伪随机数,以避免重放攻击。Nonce 也用于流密码以确保安全。如果需要使用相同的密钥加密一个以上的消息,就需要 Nonce 来确保不同的消息与该密钥加密的密钥流不同。[1]

Server 首先发送 nonce 到 Client,Client 将密码和 nonce 通过 hash 运算再提交到 Server 进行身份验证,这样我们可以认为(而非绝对)每次用于身份验证的 hash 值都不相同,即使攻击者窃取了前一次用于身份验证的 hash 值也无法冒充用户进行登录。公式如下:

A=hash(nonce,password)A = \mathrm{hash}(nonce, password)

在不安全的网络环境中,A、nonce、Hash 算法都可以被攻击者获取,如果能够满足以下条件:

  • nonce 仅仅被使用一次
  • Hash 运算不出现冲突

攻击者则在理论上无法实施 Replay attack。 因此 nonce 在特定上下文中仅仅被使用一次以及 Hash 算法尽量避免冲突是安全的关键。为了确保 nonce 在特定上下文中仅仅被使用一次,可以使用以下策略生成 nonce:

  • nonce 可以是一个时间相关变量
  • nonce 可以是一个通过足够随机算法生成的足够长的 bits

如果攻击者能够构建一个预计算的表(例如Rainbow tables)那么破解大量用户密码的时间将大大缩短。nonce 阻止了预计算表的生成(因为 Server nonce 每次都不相同),但是如果网络中传输的数据能被篡改,情况就不一样了。假定攻击者伪造一个固定的 nonce 发送给网络中的 Clients 并且记录 nonce 和 Clients 的回应(Hash(nonce, password)),由于 nonce 为一个固定值,那么攻击者就可以构造一个预计算的表,此表使用此固定的 nonce。通过此表即可大大缩短破解用户密码的时间了。[2]


  1. Nonce,维基百科,https://zh.wikipedia.org/wiki/Nonce ↩︎

  2. Nonce 避免重放攻击,简书,https://www.jianshu.com/p/dda78b530cca ↩︎