nonceとは何か?一度だけ使われる数
nonceは一度だけ使われる数であり、リクエストやメッセージに含めることで、それが新鮮でありリプレイできないことを保証する値です。
nonceは「number used once(一度だけ使われる数)」の略で、単純ながら強力なセキュリティのプリミティブです。一意で予測不可能な値をリクエストや暗号処理に含めることで、システムは各やり取りが新鮮であり、捕捉されたメッセージがリプレイできないことを保証します。nonceは認証プロトコル、コンテンツセキュリティポリシー、暗号方式に登場します。
リプレイの問題
攻撃者が有効なリクエストを捕捉すると、それを再送して支払いやログインといったアクションを繰り返すかもしれません。nonceはこれを打ち破ります。各リクエストがサーバーの見たことのない一意の値を持つため、リプレイされたリクエストは認識され拒否されます。
nonceが登場する場所
- 認証のハンドシェイク。リプレイされた認証情報を防ぐため。
- Content Security Policy。特定のインラインスクリプトを認可するため。
- 暗号モード。一意のnonceが暗号文を予測不可能に保つ場面。
暗号におけるnonce
多くの暗号モードは、同じ平文を2回暗号化しても同一の暗号文が生成されないように、メッセージごとに一意のnonceを要求します。こうした方式でnonceを再利用すると暗号が壊滅的に破られる可能性があるため、一意性は交渉の余地がありません。
CSPにおけるnonce
Content Security Policyはレスポンスごとのnonceを使って、特定のインラインスクリプトを許可しつつ他のすべてをブロックできます。サーバーは毎回新しいnonceを生成して信頼されたスクリプトタグに付与するため、nonceを持たない注入スクリプトは拒否されます。
nonceとCI/CD
あなたが構築してdeployするWebアプリは、CSPやリプレイ防止のためにnonceに依存する場合があります。それらを正しく生成すること(一意で、予測不可能で、決して再利用しない)はセキュアコーディングの一部であり、CIでのセキュリティテストはCSPのnonceが期待どおり適用されているかを検証できます。
nonceを正しく扱う
nonceはその範囲において予測不可能で真に一意でなければなりません。予測可能または再利用されたnonceは、それが提供するはずの保護そのものを損ないます。攻撃者が推測できるカウンターではなく、暗号的に安全な乱数源を使ってください。
重要なポイント
- nonceは新鮮さを保証し、リプレイを防ぐ一意の値です。
- 認証、CSP、暗号モードで使用されます。
- nonceは予測不可能で決して再利用してはならず、さもなければその目的を果たせません。