什麼是 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("Trusted script"); </script>競態條件如何破壞 Nonce 的一次性保證
Nonce 的核心價值在於「只能使用一次」,但這個特性並不是產生一串隨機值就能保證,而是仰賴後端如何驗證與標記它的使用狀態。
只要「檢查是否已使用」與「標記為已使用」之間存在時間差,攻擊者能在這段空窗內重送請求,就有機會讓同一個 Nonce 被接受多次,形成 Replay Attack。
總結
思考 Nonce 就像是替單次使用的票證,確保事件有唯一的生命週期(新鮮)
延伸閱讀
- Nonce - mdn
- Content Security Policy (CSP) - mdn
- 用 CSP (Content Security Policy) 的網站要如何安全的使用 Inline script - The Will Will Web