暗号化の基礎

鍵導出関数 かぎどうしゅつかんすう

KDFPBKDF2bcryptscryptハッシュ関数パスワードハッシュ
鍵導出関数について教えて

簡単に言うとこんな感じ!

「password123」みたいな人間が覚えやすいパスワードを、コンピューターが使う「本当に強い暗号の鍵」に変換してくれる魔法の変換器だよ!しかも意図的に「重く」作られてるから、ハッカーが総当たり攻撃しようとしても時間がかかりすぎて諦めさせられるんだ!


鍵導出関数とは

鍵導出関数(Key Derivation Function、KDF) とは、パスワードや秘密の値など「人間が扱いやすい入力」から、暗号処理に使える十分な長さと強度を持つ鍵を生成する関数のことです。たとえばファイルの暗号化やログイン認証の裏側で、ひっそりと活躍しています。

単純なハッシュ関数(SHA-256など)でパスワードを変換するだけでは、高速すぎるがゆえに総当たり攻撃(ブルートフォース攻撃) に弱くなってしまいます。KDFはわざと計算コストを高くする仕組みを持っており、攻撃者が何百万回もパスワードを試そうとすると膨大な時間がかかるよう設計されています。

現代のシステムでは、ユーザーのパスワードをデータベースに保存するとき、そのままや単純なハッシュで保存するのはセキュリティ上の危険があります。KDFを使うことで、万が一データが漏えいしても元のパスワードをすぐに解読されにくくなり、被害を最小限に抑える ことができます。


KDFの仕組みと主要な種類

KDFが「強さ」を生み出す主な要素は3つです。

要素役割具体例
ストレッチング意図的に計算を繰り返し遅くする10万回ループして変換する
ソルトパスワードにランダムな値を混ぜる同じPWでも異なるハッシュになる
コストパラメーター難しさを調整できるつまみCPU負荷・メモリ量・反復回数

代表的なKDFの種類と特徴

KDF名特徴主な用途
PBKDF2反復回数を指定してストレッチング。RFCで標準化WPA2-Personalの鍵生成、iOS
bcrypt1999年登場。コストファクターで難しさを調整WebサービスのPW保存
scryptメモリも大量消費させる。GPU攻撃に強い暗号資産(Litecoinなど)
Argon22015年Password Hashing Competition優勝。現在の推奨新規システムの標準候補
HKDF鍵を「拡張・分割」するための用途特化型KDFTLS 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は「ハッシュ関数」や「暗号化」と混同されやすいですが、目的と性質が異なります。

ハッシュ関数 例: SHA-256 ・高速に処理 ・一方向(復元不可) ・速すぎて攻撃に弱い ・整合性チェック向け 鍵導出関数(KDF) 例: Argon2, bcrypt ・意図的に低速 ・ソルトで多様化 ・攻撃コストを高める ・PW保存・鍵生成向け 暗号化 例: AES ・鍵があれば復元可 ・双方向 ・データ保護向け ・鍵の管理が重要 KDFが生成した鍵を暗号化に渡す典型的なフロー パスワード入力 KDF処理 暗号鍵生成 AES暗号化 ユーザーが覚える 意図的に時間をかける 強力な128/256bit鍵 ファイル・通信を守る ソルト(ランダム値)も混ぜることで、同じパスワードでも毎回異なる鍵が生成される

実務での使われ方

【パスワードをDBに保存するとき】

❌ 危険な方法
  DB保存値 = SHA256("password123")
  → 高速なので攻撃者がすぐ全パターン試せる

✅ 安全な方法
  salt = ランダムな値(例: "x7k9m2p...")
  DB保存値 = Argon2("password123" + salt, コスト=高)
  → 1回の試行に0.3秒かかる → 100万回試すと83日かかる

関連する規格・RFC

規格・RFC番号内容
RFC 2898 / 8018PBKDF2の仕様(PKCS#5)
RFC 5869HKDFの仕様(鍵の拡張・分割用KDF)
RFC 9106Argon2の仕様(2021年制定)
NIST SP 800-132パスワードベースの鍵導出に関するガイドライン
FIPS 198-1HMACの仕様(KDFの内部処理で使用)

関連用語

  • ハッシュ関数 — 入力を固定長の値に変換する一方向関数。KDFの内部でも使われる
  • ソルト — パスワードにランダム値を付加してレインボーテーブル攻撃を防ぐ技術
  • AES — KDFが生成した鍵を使って実際にデータを暗号化する共通鍵暗号方式
  • [