HKDF 鍵導出
RFC 5869 HMAC ベース抽出-拡張鍵導出
HKDF ドキュメント
HKDF (HMAC ベース抽出-拡張鍵導出関数) は RFC 5869 で定義されています。抽出と拡張の 2 段階プロセスを使用して、入力鍵材料から暗号鍵を導出する堅牢な方法を提供します。
HKDF は TLS 1.3、Signal プロトコル、Noise プロトコルフレームワーク、SSH など、現代のセキュリティプロトコルで広く採用されています。抽出と拡張フェーズの明確な分離により、鍵階層の導出に特に適しています。
抽出フェーズ: HKDF-Extract(salt, IKM) → PRK
抽出フェーズは、入力鍵材料 (IKM) に分散している可能性のあるエントロピーを固定長の疑似乱数鍵 (PRK) に集中させます:
- ソルト (オプション、デフォルトは HashLen 個のゼロ) と IKM を入力として受け取る
- PRK = HMAC-Hash(salt, IKM) を計算
- PRK 長はハッシュ出力長と等しい (SHA-256 では 32 バイト)
- ソルトは HMAC の鍵として機能し、抽出を強化
拡張フェーズ: HKDF-Expand(PRK, info, L) → OKM
拡張フェーズは PRK を必要な長さの出力鍵材料 (OKM) に伸張します:
- PRK、info (コンテキスト/ラベル)、希望する出力長 L を入力として受け取る
- T(i) = HMAC-Hash(PRK, T(i-1) | info | counter) を反復計算
- 結果を連結: OKM = T(1) | T(2) | ... | T(N)
- 最大出力長は 255 × HashLen バイト
一般的な使用例
- TLS 1.3 鍵スケジュール: トラフィックシークレット、ハンドシェイク鍵、アプリケーション鍵の導出
- Signal プロトコル: 共有秘密からチェーン鍵とメッセージ鍵を導出
- SSH 鍵交換: ECDH 後に暗号化鍵と完全性鍵を導出
- 鍵階層: マスターシークレットから複数の目的別鍵を導出
HKDF vs PBKDF2
| 機能 | HKDF | PBKDF2 |
|---|---|---|
| 標準 | RFC 5869 | RFC 8018 |
| 入力タイプ | 共有秘密、DH 出力 | ユーザーパスワード |
| 反復回数 | シングルパス | 多数 (10K-1M) |
| 速度 | 高速 | 意図的に低速 |
| Info パラメータ | 対応 (コンテキストバインディング) | 非対応 |
| 主な用途 | 高エントロピー入力 | 低エントロピーパスワード |
セキュリティ上の考慮事項
- HKDF は IKM に十分なエントロピーが含まれていることを前提としています;弱いパスワードには使用しないでください
- info パラメータは鍵の意図された用途を一意に識別する必要があります (コンテキスト分離)
- ソルトはオプションですが、同じ IKM から複数の鍵を抽出する場合は推奨されます
- PRK は直接使用すべきではありません;常に拡張フェーズを使用して最終鍵を導出してください