什么是 Nonce?
在先前 写给网页开发者的 CSRF 理解与防范 提到其中一种防范方式是通过生成 CSRF Token,而这其实算是一种 Nonce。
Nonce = number + used once
Nonce 等于只用一次的数值,可以是任何形式的数据:数字、字符串、递增计数器、时间戳……重点在验证「每一次操作都必须唯一」,攸关重要行动的地方都会用到 nonce。
- API 安全
- Web 登录
- 区块链
- 浏览器防护
OTP Nonce
假设一个 OTP 功能实践上在通过发送单次密码给用户后,用户输入且该 OTP 标注使用以避免重放攻击,使相同的 OTP 记录不能被重复使用,在这个情境下 OTP 就是 nonce。
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 就像是替单次使用的票证,确保事件有唯一的生命周期(新鲜)
延伸阅读
- Nonce - mdn
- Content Security Policy (CSP) - mdn
- 用 CSP (Content Security Policy) 的網站要如何安全的使用 Inline script - The Will Will Web