What is nonce?

仅使用一次的随机数,nonce 是什么?

什么是 Nonce?

在先前 写给网页开发者的 CSRF 理解与防范 提到其中一种防范方式是通过生成 CSRF Token,而这其实算是一种 Nonce。

Nonce = number + used once

Nonce 等于只用一次的数值,可以是任何形式的数据:数字、字符串、递增计数器、时间戳……重点在验证「每一次操作都必须唯一」,攸关重要行动的地方都会用到 nonce。

  • API 安全
  • Web 登录
  • 区块链
  • 浏览器防护

OTP Nonce

假设一个 OTP 功能实践上在通过发送单次密码给用户后,用户输入且该 OTP 标注使用以避免重放攻击,使相同的 OTP 记录不能被重复使用,在这个情境下 OTP 就是 nonce。

DBServerUserDBServerUser创建 OTP (verify=false)发送 OTP提交 OTP查询 OTP verify 状态verify=false更新 verify=true更新成功验证成功

CSP 如何运用 Nonce

浏览器 Content Security Policy 也利用 Nonce 来防止恶意 JavaScript 被执行。当网站启用 CSP 时,可以透过 script-src 指定一组 nonce,只有带有相同 nonce 的 <script> 标签才允许执行。

Content-Security-Policy: script-src 'nonce-r4nd0m123';
<script nonce="r4nd0m123"> console.log("受信任脚本"); </script>

竞态条件如何破坏 Nonce 的一次性保证

Nonce 的核心价值在于「只能使用一次」,但这个特性并不是产生一串随机值就能保证,而是仰赖后端如何验证与标记它的使用状态。 只要「检查是否已使用」与「标记为已使用」之间存在时间差,攻击者能在这段空窗内重送请求,就有机会让同一个 Nonce 被接受多次,形成 Replay Attack(重放攻击)。

总结

思考 Nonce 就像是替单次使用的票证,确保事件有唯一的生命周期(新鲜)

延伸阅读