ノンス

ノンス（、ナンスとも）は、暗号通信で用いられる、使い捨てのランダムな値のことである。ノンスはたいてい、認証の過程で使われ、リプレイ攻撃を行えないようにする働きを担っている。具体例として、HTTPのDigest認証では、パスワードのMD5ダイジェストを計算する過程でノンスが使われている。ノンスはサーバが401 Unauthorizedを返すごとに違っているので、リプレイ攻撃はほとんど不可能となる。

次に、インターネット上で買い物をするような例を考える。ノンスを使わない場合、攻撃者が暗号化された注文データを手に入れれば、それを再度送信することで、暗号を解読せずとも注文を繰り返すことができてしまう。ここで注文データの中に、一度ごとに使い捨てとするノンスを加えることで、複数回の注文を繰り返してもそれぞれデータとして異なるようになる。同じノンスで送られた注文データを不正なものとして無視することで、前述のような攻撃は成立しなくなる。ノンスの中にはタイムスタンプを使うことで時間的な順序を担保するような用法もあるが、この場合は両側での時刻同期が必須となる。クライアント側がノンス（cnonceと呼ばれる）を生成するプロトコルも、Digest認証などいくつか存在する。

ストリーム暗号でも、同じ鍵で暗号化の結果をメッセージごとに異なったものとするためにノンスが使われることがある。この場合、メッセージの番号を使うことも多い。同様の目的で使われる初期化ベクトルも、見方を変えればノンスの一種とも考えられる。「一度きり」であることを担保するための方法として、できるだけ粒度の細かいタイムスタンプから生成する、あるいは充分なエントロピーを持った乱数で生成して、重複する可能性を現実的でないほどに下げるというような手法がとられる。ノンスには擬似乱数性、すなわち予測不可能性が必要だとする議論もある。

プルーフ・オブ・ワークシステムにおいては、暗号学的ハッシュ関数の出力を変えて特定の条件を満たさせるためにノンスが使われる。条件を満たすようなハッシュ値を生成するのは、それを検証するよりずっと困難なことであり、通常とは違う側に処理の負荷をかけることができる。このようなシステムの具体例としてビットコインがあり、ブロックチェーンに対するハッシュの頭に続くべきゼロの数を調節することで、難易度を調節している。ハッシュが暗号学的なものである以上、特定の出力が得られるような入力を任意に生成することはできず、ひたすらノンスを生成して総当たりで探すほかに方法はない。ビットコインのマイニングとは、条件に当てはまるノンスを探す作業のことであり、一番乗りできればビットコインが得られる。

関連項目 
 ソルト (暗号)

脚注

外部リンク 
 Sam Ruby Blogging on Nonce with an implementation
  - HTTP Authentication: Basic and Digest Access Authentication
  - Robust Explicit Congestion Notification (ECN) Signaling with Nonces
 RFC 4418 - UMAC: Message Authentication Code using Universal Hashing

暗号
乱数