鍵導出関数
暗号理論分野における鍵導出関数(かぎどうしゅつかんすう, 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。パスワードに対する総当たり攻撃を困難にするため、多数の反復計算をするなど、わざと計算に時間がかかるように設計される。例えばPBKDF2がある。
- 一つの秘密の値から、秘密ではない値を組み合わせることで複数の鍵を生成するもの。これは「key diversification」とも呼ばれる。生成された一つの鍵を得た攻撃者が、元の秘密の値や、他の鍵についての有用な情報を得るのを阻止する。また、鍵導出関数によって生成された鍵は、特定の暗号システムにおける「弱鍵」を避けるなど、望ましい性質を持つことも保証される。
- 鍵共有プロトコルの一要素として利用されるもの。例として、KDF1(IEEE Std 1363-2000て定義されている)や ANSI X9.42の同様の関数がある。
- ある鍵から、長さの異なる鍵を得るためのもの。HKDFはこの目的の鍵導出関数である。
パスワードハッシュ
[編集]鍵導出関数は、本来の目的とは異なる利用方法として、パスワードをパスワードファイルやシャドウパスワードファイルに保管する際のハッシュ関数として使われることが多く、「パスワードハッシュ関数」とも呼ばれる。パスワードハッシュ関数は、総当たり攻撃や辞書攻撃への耐性のため、計算に比較的時間がかかる必要があり、key stretching用の鍵導出関数がこの目的にかなっている。入力にランダムに選ばれた秘密でない値(ソルト)を加えることで、辞書攻撃に強くなる[5]。
脚注
[編集]- ^ これは、一般的な「擬似乱数の関数」のことではなく、暗号学上の概念で pseudorandom function family(en:Pseudorandom function family)と呼ばれる関数の族に含まれるような、ランダムオラクルをエミュレートするefficiently-computableな関数、のこと。
- ^ Bezzi, Michele (2011). “Data privacy”. In Camenisch, Jan. Privacy and Identity Management for Life. Springer. pp. 185–186. ISBN 9783642203176
- ^ Kaliski, Burt. “RFC 2898 -- PKCS #5: Password-Based Cryptography Specification, Version 2.0”. IETF. 19 March 2017閲覧。
- ^ “Password Security: A Case History.”. Bell Laboratories (1978年4月3日). 2011年5月9日閲覧。
- ^ “Salted Password Hashing - Doing it Right”. CrackStation.net. 29 January 2015閲覧。
外部リンク
[編集]- Percival, Colin (May 2009). “Stronger Key Derivation via Sequential Memory-Hard Functions” (PDF). BSDCan'09 Presentation. 2009年5月19日閲覧。