鍵導出関数 かぎどうしゅつかんすう
簡単に言うとこんな感じ!
「password123」みたいな人間が覚えやすいパスワードを、コンピューターが使う「本当に強い暗号の鍵」に変換してくれる魔法の変換器だよ!しかも意図的に「重く」作られてるから、ハッカーが総当たり攻撃しようとしても時間がかかりすぎて諦めさせられるんだ!
鍵導出関数とは
鍵導出関数(Key Derivation Function、KDF) とは、パスワードや秘密の値など「人間が扱いやすい入力」から、暗号処理に使える十分な長さと強度を持つ鍵を生成する関数のことです。たとえばファイルの暗号化やログイン認証の裏側で、ひっそりと活躍しています。
単純なハッシュ関数(SHA-256など)でパスワードを変換するだけでは、高速すぎるがゆえに総当たり攻撃(ブルートフォース攻撃) に弱くなってしまいます。KDFはわざと計算コストを高くする仕組みを持っており、攻撃者が何百万回もパスワードを試そうとすると膨大な時間がかかるよう設計されています。
現代のシステムでは、ユーザーのパスワードをデータベースに保存するとき、そのままや単純なハッシュで保存するのはセキュリティ上の危険があります。KDFを使うことで、万が一データが漏えいしても元のパスワードをすぐに解読されにくくなり、被害を最小限に抑える ことができます。
KDFの仕組みと主要な種類
KDFが「強さ」を生み出す主な要素は3つです。
| 要素 | 役割 | 具体例 |
|---|---|---|
| ストレッチング | 意図的に計算を繰り返し遅くする | 10万回ループして変換する |
| ソルト | パスワードにランダムな値を混ぜる | 同じPWでも異なるハッシュになる |
| コストパラメーター | 難しさを調整できるつまみ | CPU負荷・メモリ量・反復回数 |
代表的なKDFの種類と特徴
| KDF名 | 特徴 | 主な用途 |
|---|---|---|
| PBKDF2 | 反復回数を指定してストレッチング。RFCで標準化 | WPA2-Personalの鍵生成、iOS |
| bcrypt | 1999年登場。コストファクターで難しさを調整 | WebサービスのPW保存 |
| scrypt | メモリも大量消費させる。GPU攻撃に強い | 暗号資産(Litecoinなど) |
| Argon2 | 2015年Password Hashing Competition優勝。現在の推奨 | 新規システムの標準候補 |
| HKDF | 鍵を「拡張・分割」するための用途特化型KDF | TLS 1.3、Signal Protocol |
覚え方:「塩をふって、じっくり煮込む」
KDFは料理に例えると分かりやすいです。ソルト(塩) をふって(ランダム値を混ぜて)、じっくり時間をかけて煮込む(反復処理) ことで、簡単には真似できない味(暗号鍵)が完成します。火を強くすれば速くできますが、それだと攻撃者も速く試せてしまうので、あえてじっくり時間をかけるのがポイントです。
歴史と背景
- 1970年代〜 UnixのcryptコマンドがパスワードハッシュにDESベースの変換を使用。当時は十分だったが、後にコンピューターの高速化で危険に
- 1999年 Niels Provos と David Mazièresが bcrypt を発表。コストパラメーターで将来のCPU高速化にも追従できる設計
- 2000年 RSA Laboratoriesが PBKDF2 をPKCS#5として標準化。後にRFC 2898、RFC 8018として整理
- 2009年 Colin Percivalが scrypt を発表。GPUでの並列攻撃を防ぐためメモリ使用量も多くする設計を採用
- 2012〜2015年 各国の研究者が参加した Password Hashing Competition(PHC) が開催
- 2015年 PHCの優勝アルゴリズムとして Argon2 が選出。現在のセキュリティ界での推奨KDF
- 2018年 TLS 1.3が策定され、鍵スケジュールに HKDF が標準採用される
KDFとハッシュ関数・暗号化の違い
KDFは「ハッシュ関数」や「暗号化」と混同されやすいですが、目的と性質が異なります。
実務での使われ方
【パスワードをDBに保存するとき】
❌ 危険な方法
DB保存値 = SHA256("password123")
→ 高速なので攻撃者がすぐ全パターン試せる
✅ 安全な方法
salt = ランダムな値(例: "x7k9m2p...")
DB保存値 = Argon2("password123" + salt, コスト=高)
→ 1回の試行に0.3秒かかる → 100万回試すと83日かかる
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 2898 / 8018 | PBKDF2の仕様(PKCS#5) |
| RFC 5869 | HKDFの仕様(鍵の拡張・分割用KDF) |
| RFC 9106 | Argon2の仕様(2021年制定) |
| NIST SP 800-132 | パスワードベースの鍵導出に関するガイドライン |
| FIPS 198-1 | HMACの仕様(KDFの内部処理で使用) |