鍵導出関数(Key Derivation Function, KDF)
暗号理論における鍵導出関数(KDF)は、マスター鍵、パスワード、パスフレーズといった秘密の値から、一つまたは複数の秘密鍵を生成するために用いられる関数です。このプロセスでは、擬似ランダム関数(PRF)が利用されます。
鍵導出関数の役割
KDFは、以下のような目的で利用されます。
鍵の伸長: 短い鍵を、より長い鍵へと拡張する。
鍵のフォーマット変換:
ディフィー・ヘルマン鍵共有などで得られた値を、AESのような
暗号アルゴリズムで使用できる形式に変換する。
歴史
初期の鍵導出関数としては、
1978年に登場した「crypt」があります。しかし、この関数にはパスワードの文字数制限(8文字)や、脆弱なソルトの使用といった問題がありました。
現代的なパスワードベースの鍵導出関数(
PBKDF2など)は、より強力なソルトを使用し、意図的に計算に時間を要するように設計されています。これは、
総当たり攻撃への耐性を高めるためです。
しかし、GPUやFPGAを用いた並列処理による
総当たり攻撃が深刻化しています。これに対抗するため、bcrypt、scrypt、そしてより新しいargon2といった関数が登場しました。
鍵導出の多様な目的
当初、KDFはパスワードやパスフレーズから鍵を生成するために利用されていました。現在では、以下のような異なる目的で利用されています。
1.
パスワードベース鍵導出関数 (Password-Based Key Derivation Function):
パスワードやパスフレーズから鍵を生成します。
キー・ストレッチング(Key stretching)とも呼ばれます。
総当たり攻撃への耐性を高めるため、計算に時間を要するように設計されています(例:PBKDF2)。
2. キー・ダイバーシフィケーション (Key Diversification):
一つの秘密の値と公開値を組み合わせて、複数の鍵を生成します。
これにより、一つの鍵が漏洩した場合でも、元の秘密の値や他の鍵への影響を最小限に抑えます。
鍵導出関数によって生成された鍵は、特定の
暗号システムにおける「弱鍵」を避けるといった望ましい性質を持つように設計されます。
3.
鍵共有プロトコルにおける利用:
鍵共有プロトコルの一部として利用されます(例:KDF1, ANSI X9.42)。
4. 長さの異なる鍵の生成:
ある鍵から、異なる長さの鍵を生成するために使用されます(例:HKDF)。
パスワードハッシュ関数としての利用
KDFは、本来の目的とは別に、パスワードを安全に保管するためのハッシュ関数としても用いられることがあります。特に、キー・ストレッチングを目的としたKDFは、
総当たり攻撃や辞書攻撃に対する耐性が高いため、パスワードハッシュ関数として適切です。
パスワードハッシュ関数は、ソルトと呼ばれるランダムな値を入力に追加することで、辞書攻撃への耐性をさらに高めます。
まとめ
鍵導出関数は、現代の
暗号システムにおいて不可欠な要素です。パスワードやマスター鍵から安全な鍵を生成し、様々な
暗号アルゴリズムやプロトコルで使用できます。また、パスワードの安全な保管にも貢献しており、情報セキュリティにおいて重要な役割を果たしています。