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("Trusted script"); </script>

競態條件如何破壞 Nonce 的一次性保證

Nonce 的核心價值在於「只能使用一次」,但這個特性並不是產生一串隨機值就能保證,而是仰賴後端如何驗證與標記它的使用狀態。

只要「檢查是否已使用」與「標記為已使用」之間存在時間差,攻擊者能在這段空窗內重送請求,就有機會讓同一個 Nonce 被接受多次,形成 Replay Attack。

總結

思考 Nonce 就像是替單次使用的票證,確保事件有唯一的生命週期(新鮮)

延伸閱讀