暗号理論分野における鍵導出関数(かぎどうしゅつかんすう, key derivation function, KDF)は、一つのマスター鍵やパスワード、パスフレーズなどの秘密の値から、一つあるいは複数の秘密鍵を導出するために用いられる関数であり、pseudorandom function(PRF)[1]が利用される[2][3]。 鍵導出関数は、鍵をより長い鍵に引き延ばしたり、必要なフォーマットを持つ鍵を得るために使うことができる。例えば、ディフィー・ヘルマン鍵共有で共有される値は何らかの群の要素であるが、これをAESで用いる共通鍵へ変換する。
1978年に「crypt」というパスワードベースの鍵導出関数が登場したが、パスワードの文字数の上限が8文字であることや、saltが弱い[4]など問題があった。 PBKDF2などの現代的なパスワードベースの鍵導出関数は、より強いsaltを使い、動作も良い意味で遅い。 ただし、GPUやFPGAなどを使った並列処理による総当たり攻撃が問題になってきており、これに対処するために、bcryptやscrypt、より新しいものではargon2などが登場している。
鍵導出関数の提案された当初の利用目的は、秘密のパスワードやパスフレーズから鍵を得ることであったが、以下のように異なる目的のものがある。
鍵導出関数は、本来の目的とは異なる利用方法として、パスワードをパスワードファイルやシャドウパスワードファイルに保管する際のハッシュ関数として使われることが多く、「パスワードハッシュ関数」とも呼ばれる。パスワードハッシュ関数は、総当たり攻撃や辞書攻撃への耐性のため、計算に比較的時間がかかる必要があり、key stretching用の鍵導出関数がこの目的にかなっている。入力にランダムに選ばれた秘密でない値(ソルト)を加えることで、辞書攻撃に強くなる[5]。