KDF(鍵導出関数)とは
KDF(Key Derivation Function / 鍵導出関数)は、パスワードや共有秘密、マスターキーなどの入力値から、暗号化に使用する安全な鍵を生成するためのアルゴリズムです。
KDFが必要とされる主な理由は以下の通りです:
- エントロピーの増大:弱いパスワードから強力な鍵を生成
- 鍵の長さ調整:任意の長さの鍵を生成
- ブルートフォース攻撃への耐性:計算コストを意図的に高める
- 複数鍵の生成:一つのマスターキーから複数の用途別鍵を導出
KDFの種類と特徴
パスワードベースKDF(PBKDF)
パスワードから鍵を導出するために設計されたKDFです。ブルートフォース攻撃への耐性を高めるため、意図的に計算を遅くします。
| アルゴリズム | 特徴 | 推奨用途 |
|---|---|---|
PBKDF2 |
広く実装されている。イテレーション数で調整 | レガシーシステム、互換性重視 |
scrypt |
メモリハード。GPU攻撃に強い | 暗号通貨、ディスク暗号化 |
Argon2 |
最新の標準。メモリ・CPU両方調整可能 | 新規開発、パスワードハッシュ |
bcrypt |
パスワードハッシュに特化 | ユーザーパスワード保存 |
非パスワードベースKDF
すでに十分なエントロピーを持つ秘密情報から鍵を導出する場合に使用します:
- HKDF(HMAC-based KDF):Diffie-Hellman鍵交換後の鍵導出に最適
- KDF1/KDF2:古典的なKDF。現在はHKDFを推奨
AIエンジニアとしての実体験
機械学習モデルを配布する際、モデルファイルを暗号化することがあります。このとき、ユーザーが入力するライセンスキーから実際の暗号化鍵を導出するためにKDFを使用します。
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import os
# ライセンスキーからAES鍵を導出
def derive_key_from_license(license_key: str, salt: bytes = None) -> bytes:
if salt is None:
salt = os.urandom(16)
hkdf = HKDF(
algorithm=hashes.SHA256(),
length=32, # AES-256用
salt=salt,
info=b"model-encryption-key"
)
return hkdf.derive(license_key.encode()), salt
# パスワードベースの場合(scrypt使用)
from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
def derive_key_with_scrypt(password: str, salt: bytes) -> bytes:
kdf = Scrypt(
salt=salt,
length=32,
n=2**14, # CPUコスト
r=8, # ブロックサイズ
p=1 # 並列度
)
return kdf.derive(password.encode())
自社サーバー運用への応用
ディスク暗号化
LUKS(Linux Unified Key Setup)は、PBKDF2またはArgon2を使用してパスフレーズから暗号化鍵を導出します。
# LUKSボリュームの作成(Argon2使用)
cryptsetup luksFormat --pbkdf argon2id /dev/sdb1
# 既存LUKSのKDFパラメータ確認
cryptsetup luksDump /dev/sdb1 | grep -A5 "PBKDF"
TLSセッション鍵の導出
TLS 1.3では、HKDFを使用してハンドシェイク時に複数のセッション鍵を導出します。
関連ブログ記事
📝 関連記事
【2026年最新】OpenSSLの深刻な問題とは? - KDFの実装についても触れています。
最新動向(2026年)
Argon2の普及
2015年のPassword Hashing Competitionで優勝したArgon2が、徐々に標準として採用されています。OWASP(Open Web Application Security Project)もArgon2idを第一推奨としています。
ポスト量子暗号への対応
量子コンピュータに対しても、適切なパラメータを選択したKDFは安全であると考えられています。ただし、出力鍵長を2倍にすることが推奨されています。
トラブル事例と対策
⚠️ イテレーション数の不足
問題:PBKDF2のイテレーション数が少なすぎるとブルートフォース攻撃に脆弱
対策:OWASP推奨では最低でも310,000イテレーション(SHA-256使用時)
⚠️ ソルトの再利用
問題:同じソルトを使うとレインボーテーブル攻撃が可能に
対策:各導出ごとに一意のランダムソルト(最低16バイト)を使用
権威あるリソース
- OWASP Password Storage Cheat Sheet
- RFC 5869 - HKDF
- RFC 8018 - PKCS #5 (PBKDF2)
- Argon2 Reference Implementation
