要約

  • RFC 9923 は FNV を高速で実装規模の小さい非暗号学的ハッシュとして記録し、衝突や原像探索を計算困難にする必要がある用途には推奨していない。
  • セキュリティ節は、バケット表への衝突を誘導して検索・更新を遅くするモデルを示し、ルーター内の RIB 情報も用途例に含める。停止しなくてもサービスは劣化し得る。
  • 有効な統制は、現在の関数と offset_basis を世代として保存し、偏りを観測し、条件を変えて既存状態を再ハッシュし、分布と遅延の回復を確認できることにある。

稼働中という表示が隠すもの

ここでは RFC の仕組みを説明するために仮想の運用場面を置く。実在する障害の報告ではない。あるネットワークサービスはヘルスチェックに応答し、表にある項目も失っていない。検索結果は最終的に正しい。ところが、一部のバケットだけ鎖が長くなり、更新の上位パーセンタイルが悪化し、CPU の待ち行列が伸びている。平均値はまだ平穏に見える。

この状態を「利用可能」と呼ぶかは、監視が何を見ているかで変わる。プロセスの生存と正しい応答だけを測れば緑になる。制御面や経路関連の表では、必要な時間内に答えられることも機能の一部だ。正しい結果が遅れて到着する状態は、利用者にとって停止と同じ効果を持つことがある。

RFC 9923 は Fowler/Noll/Vo、すなわち FNV を、高速、小さなコード量、良好な分散を狙った関数としてまとめた。URL、ホスト名、ファイル名、文字列、IP アドレス、MAC アドレスなど、互いによく似た入力を大量に処理する用途が挙げられる。これは正当な工学上の価値であり、「非暗号学的」という分類だけで否定されるものではない。

分類が示すのは取引条件である。FNV は少ない仕事で再現可能な値を作る。その代わり、衝突、第一原像、第二原像の探索を計算上不可能に近づける仕事は引き受けない。RFC は、その困難性を必要とする用途では FNV を推奨せず、能動的な攻撃者が入力を操作できるセキュリティ方式にも一般に適さないと明記する。

同じ表示値に隠れた入力契約

文書の中心は FNV-1a である。計算は offset_basis から始まり、入力の各オクテットを現在値へ XOR し、その後に幅ごとの FNV_Prime を乗じる。結果は選んだビット幅の二の累乗で剰余を取る。定義される幅は 32、64、128、256、512、1024 ビットである。短い入力に対する分散の運用経験から、一般用途には FNV-1a が勧められている。

最終値だけを保存しても、計算の再現性は残らない。フィールド順、区切り、文字列の正規化、入力の長さ表現、幅、起点が異なれば、業務上は同じ項目でも別の値になる。逆に値が一致しても、選ばれたバイト列と条件が同じ出力へ着いたことしか示さない。送信者の身元、入力の由来、利用権限、内容の意味までは証明しない。

offset_basis は特に誤解されやすい。RFC 9923 は、一般には非ゼロのほぼどの値でも使える一方、異なる basis で計算した FNV は相互運用しないとする。非標準の basis を攻撃者に知らせなければ、既知の条件で衝突候補を事前計算する攻撃を妨げられる場合がある。しかし、それは限定的な予測困難性であり、認証鍵ではない。出力や性能変化を繰り返し観測できる相手は、実システムとの対話から有効な集合を学べる。

表現形式も外部境界では契約になる。永続保存または異なるハードウェア間の相互運用では、RFC は FNV 値をリトルエンディアンで表すよう求める。互換性のあるプロセッサ上でメモリを共有するプロセス群は自然な形式を一貫して使えるが、ビッグエンディアン機で整数を返す関数は、標準のバイト列と比較すると逆順に見え得る。比較不一致はデータ変更ではなく、表現の不一致かもしれない。

分散の偏りがサービス拒否へ変わるまで

RFC のモデルは単純である。n 個のバケットを持つ表で、項目 i は hash(i) mod n によって行き先を決める。同じバケットへ入った項目は連結される。この構造はコンパイラーのシンボル表や、ルーター内の一部 RIB 情報に使われる可能性がある。一つのバケットが長くなれば、その中の検索と更新に余分な時間がかかる。

衝突は、それだけでは攻撃の証拠にならない。有限の出力空間には必ず重複があり、さらにバケット数で剰余を取れば集約は増える。容量不足、高い負荷率、正当な入力の偏り、リサイズ不具合でも長い鎖は生まれる。運用者が必要とするのは、自分の実装と負荷に基づく平常分布であり、衝突を一律に悪意とみなす規則ではない。

攻撃条件は、入力を供給する側が分布を形作れるときに成立する。関数、basis、バケットへの写像が既知なら、相手はオフラインで候補を試し、同じ添字に落ちる異なる入力を大量に用意できる。その集合を投入すれば、本番で事前に探索することなく一つの鎖へ処理を集中させられる。未知の basis は、結果を観測できない相手の事前計算には効果があり得る。

結果を観測できる場合は事情が変わる。多様な入力を繰り返し送り、応答時間や劣化を測れる相手は、試行から衝突らしい集合を蓄積できる。RFC 9923 が重要な注意として示すのは、このフィードバック型の探索は暗号学的ハッシュへ置き換えるだけでは消えないことだ。関数から直接衝突を作る難度は上がっても、有限の表を繰り返し観測する経路は残る。

したがって、「seed を秘密にする」だけでは復旧策にならない。RFC は、異常に多い衝突を検出したら関数に変更を加えて既存項目を再ハッシュし、その後も新しい設定を使う防御を記述する。FNV なら offset_basis の変更が一例になる。商用ルーターにも内部表の過剰衝突を緩和する同種の技法があると述べるが、機種や企業は示していない。ここで扱う事実も技法までである。

再ハッシュは二つの世界をまたぐ

basis を変えた瞬間に、ハッシュの新しい世代が始まる。旧表の項目は新しい位置へ移さなければならない。移行中に読み取りが旧表と新表のどちらを参照するか、新規書き込みをどこへ置くか、削除を両方へ反映するかを決める必要がある。CPU とメモリに再構築の余裕がなければ、防御動作が自らサービスを止めてしまう。

ロールバックも設定値の復元だけでは終わらない。切替開始後に新世代へ入った項目を旧世代へ戻す記録がなければ、見えない状態が生まれる。二重書き、移行ログ、水位、失敗時の再試行、重複と削除の順序を事前に試験すべきである。ジョブが終了コード 0 を返した事実は、全項目が到達可能である証明ではない。

FNV 値をプロセス外へ出す設計では、さらに慎重さが要る。ファイルへ保存し、永続 ID として使い、API で渡し、通信相手が比較するなら、幅、basis、入力順、エンディアンの変更は内部最適化ではなく互換性変更となる。ローカル表を救う操作で、外部の意味を黙って変えてはならない。

衝突復旧レシートは、旧世代と新世代を結ぶ。旧側では、入力の正確な符号化、FNV の種類、幅、prime、offset_basis、表現、表サイズ、バケット算出法を保存する。占有分布、衝突数、負荷率、検索・更新のテール遅延、CPU、キュー、観測期間、対象入力群、事象を宣言した規則も必要になる。

新側では、採用した関数または basis、実装版、開始と完了、並行読書きの扱い、移動件数、互換ブリッジ、ロールバック点、移せなかった項目を記録する。切替後に同じ測定を繰り返し、分布だけでなくサービス時間が戻ったかを確認する。「再ハッシュ済み」という状態名は、業務結果の証拠ではない。

レシートには非結論も明記する。FNV の一致は主体を認証せず、由来を証明せず、経路を承認せず、改ざん耐性も保証しない。各命題には別の統制が要る。索引という狭い役割から外へ意味を膨らませないことが、FNV を有用なまま保つ条件である。

RFC に載ることと適用可能性は別である

FNV を参照する標準でも役割は限定される。RFC 7357 は、複数の適格な TRILL 出口から一つを選ぶ疑似乱数的な例に FNV-32 を使う。異なる入側 RBridge が同じ関数を使う必要すらない。目的は分散選択であり、出口の真正性ではない。

RFC 7873 は DNS Client Cookie の簡単な例として、クライアントとサーバーのアドレス、クライアント秘密を FNV64 に入れる。より計算量の多い HMAC-SHA256 の例も示す。DNS Cookie の保護は特定の off-path 攻撃に限定され、DNSSEC のデータ起源認証や一般的なトランザクション保護を代替しない。安全性はハッシュ名ではなく、秘密、入力、プロトコル検査、脅威モデルの組合せから生じる。

RFC 6234 は暗号学的な対照を与える。Secure Hash Algorithm は原像や同一 digest を持つ異なるメッセージの探索を計算困難にすることを目的とし、署名、HMAC、鍵導出と組み合わせて使われる。だからといって全ての内部索引を暗号化すべきだという話ではない。守るべき性質を先に決めるという話である。

RFC 9923 は Informational の Independent Submission であり、IETF Standards Track でも IETF 合意でもない。RFC 7841 が説明するように、RFC の stream と status は作成・審査経路を伝える。番号が付いたことは実装適合性の証明ではない。他方、標準化過程が異なることも、記録された技術を無価値にしない。利用者が境界を読んで、実運用で検証すべきである。

これは Running-Code Primacy の具体例である。文書は定数、手順、表現と既知の危険を公開できる。現場は表の挙動を測り、前提が崩れた時に世代を変えなければならない。出版物は判断材料であり、稼働中の結果が最終的な判断面になる。

出典