付録 A. 20 ビットハッシュ関数の例 (Example 20-Bit Hash Function)
本付録では、フローラベル値の生成に使用できるハッシュ関数の例を提供します。これは必須のアルゴリズムではありません。実装は適切なフローラベル値の分布を生成する任意の方法を自由に使用できます。
目的 (Purpose)
このハッシュ関数の目的は以下の特性を持つフローラベル値を生成することです。
- 近似的な離散一様分布
- 第三者による予測困難性
- 同じフローに属するパケットに対する一貫性
- 効率的な計算可能性
アルゴリズムの説明 (Algorithm Description)
ハッシュ関数は以下を入力として受け取ります。
- 送信元アドレス (Source Address)(128 ビット)
- 宛先アドレス (Destination Address)(128 ビット)
- 送信元ポート (Source Port)(16 ビット)
- 宛先ポート (Destination Port)(16 ビット)
- プロトコル番号 (Protocol Number)(8 ビット)
- 送信元ノード固有の秘密鍵(128 ビット)
出力は 20 ビットのフローラベル値です。
MD5 を使用した例 (Example Using MD5)
入力 (Input):
- 送信元アドレス: 128 ビット
- 宛先アドレス: 128 ビット
- 送信元ポート: 16 ビット
- 宛先ポート: 16 ビット
- プロトコル: 8 ビット
- 秘密鍵: 128 ビット
処理 (Process):
1. すべての入力を連結: 合計 424 ビット
2. MD5 ハッシュを計算: 128 ビット出力
3. MD5 出力の最初の 20 ビットをフローラベルとして使用
出力 (Output):
- フローラベル: 20 ビット
セキュリティの考慮事項 (Security Considerations)
秘密鍵は攻撃者がフローラベル値を予測することを防ぐために不可欠です。秘密鍵は以下であるべきです。
- 長さが少なくとも 128 ビット
- 暗号学的に安全な乱数生成器を使用して生成
- 各送信元ノードで一意
- 機密に保ち、ネットワーク経由で転送しない
- 定期的に変更(例:毎日または毎週)
パフォーマンスの考慮事項 (Performance Considerations)
各パケットに対して暗号ハッシュを計算することは計算コストが高い場合があります。実装は以下の方法でパフォーマンスを最適化できます。
- キャッシング (Caching): アクティブなフローのフローラベル値をキャッシュし、同じフローの後続パケットで再利用する。
- 軽量ハッシュ (Lightweight Hash): 十分な予測不可能性を提供する限り、完全な暗号ハッシュの代わりに軽量ハッシュ関数を使用する。
- ハードウェアアクセラレーション (Hardware Acceleration): 利用可能な場合はハッシュ計算にハードウェアアクセラレーションを使用する。
例のコード(疑似コード)(Example Code - Pseudocode)
function compute_flow_label(src_addr, dst_addr, src_port, dst_port, protocol, secret_key):
// 入力を連結
input = concatenate(src_addr, dst_addr, src_port, dst_port, protocol, secret_key)
// ハッシュを計算
hash_output = MD5(input)
// 20 ビットを抽出
flow_label = hash_output[0:20] // 最初の 20 ビット
// ゼロでないことを確認(オプション)
if flow_label == 0:
flow_label = 1
return flow_label
注意事項 (Notes)
- フローラベル値 0 は特別な意味を持ちます(ラベルなしパケット)。実装はフローラベル 0 の生成を避けることを選択してもよいし、許可してもよいです。
- ハッシュ関数はフロー内のすべてのパケットに一貫して適用され、すべてが同じフローラベル値を受け取ることを確保すべきです。
- 秘密鍵は保護され、潜在的な攻撃者に公開されないようにすべきです。