HKDFは、 HMACメッセージ認証コードに基づいた多目的鍵導出関数(KDF)です。HKDFは「抽出してから展開する」というパラダイムに従っており、論理的には2つのモジュールで構成されています。最初の段階では、入力鍵素材を受け取り、そこから固定長の擬似乱数鍵を「抽出」し、次に2番目の段階で、この鍵をKDFの出力として複数の独立した擬似乱数鍵に「展開」します。
HKDFは、HKDF-ExtractとHKDF-Expandという2つの関数から構成されています。
HKDF(salt, IKM, info, length) = HKDF-Expand(HKDF-Extract(salt, IKM), info, length) [ 1 ] : 11
HKDF-Extract ( XTR ) は、 Diffie-Hellmanを使用して生成された共有秘密などの「入力鍵マテリアル」または「ソース鍵マテリアル」( IKMまたはSKM ) 、オプションの非秘密のランダムまたは擬似ランダムソルト( r ) を受け取り、PRK (「擬似ランダム鍵」) と呼ばれる暗号鍵を生成します。HKDF-Extract は「ランダム性抽出器」として機能し、[ a ] [ 1 ] : 1特に「計算抽出器」として機能し、十分な最小エントロピーの潜在的に非一様の値を受け取り、一様ランダム値 (擬似ランダム) と区別できない値を生成します。[ 1 ] : 9–11 [ 2 ]計算抽出器は、攻撃者が計算的に制限されており、ソースエントロピーは計算的な意味でのみ存在する可能性があると想定しています。このような抽出器は、適切な仮定の下で暗号関数を用いて構築することができ、汎用ハッシュ関数(一般的な場合)またはランダムオラクル(エントロピーの弱い情報源などの制約のあるシナリオの場合)としてモデル化できる。[ 1 ]: 1-3
Salt ( r ) は「ソースに依存しない抽出器」として機能し、[ b ] HKDF のセキュリティ保証を強化します。[ 2 ]固定の公開rを使用することは、HKDF の複数回の呼び出し (同じソースから派生している場合もそうでない場合もある「独立した」秘密のIKMに対して) に対して安全です。 [ 1 ] : 4–6 [ 3 ] : 6ただし、rが攻撃者によって選択または操作されていないことが条件です。[ 3 ] : 6理想的には、rはハッシュ関数の出力長のランダムな文字列です。低品質のr (弱いエントロピーまたは短い長さ) であっても、 OKMのセキュリティに「大きく」貢献するため推奨されます。[ 3 ] : 4–5エントロピーが低く秘密でないrの有無にかかわらず、攻撃者がHKDF-Extractの基盤となるハッシュ関数を悪用する形でIKM sのソースに影響を与えることができる場合(衝突や特定のバイアスを見つけるなど)、 XTRは保護を提供しません。ランダムなrは、アプリケーションによって固定されている場合でも(例えば、 rをシードとして使用する乱数生成器など)、その特定の抽出セッションの保護を強化します。[ 1 ] : 9,24–26このような状況では、十分に長いIKM sはエントロピー抽出も向上させます。[ 1 ] : 24しかし、攻撃者がrを見た後にIKMの十分な部分に影響を与えることを許容すると、完全に安全でないKDFになる可能性があります。[ 1 ] : 8–9
HKDF-Extract は、キーとしてr (指定されていない場合は、基となる抽出ハッシュ関数の長さまですべてゼロ) を使用し、メッセージとしてIKMを使用したHMAC の結果です。 [ 3 ] : 3 HKDF-Extract ステップで使用される基となるハッシュ関数は、HKDF-Expand で使用されるものと異なる場合があります。HKDF-Extract では、アプリケーションで使用可能な最強のハッシュ関数を使用することが推奨されます。 [ 1 ] : 27これは、IKMに既に存在するエントロピーを「集中」させますが、必ずしもエントロピーを「追加」するわけではないためです。[ 3 ] : 2 XTR用のより強力な基となるハッシュ関数(たとえば、SHA512/256) からの切り捨て出力は、より強力な抽出特性を提供します。[ 1 ] : 17攻撃者は、 IKMに関する部分的な知識 (Diffie-Hellman の場合は公開されている値) または部分的な制御 (エントロピー プール) を持っていると想定されます。[ 3 ]: 2
IKM自体が暗号学的に強力な鍵である場合(したがってPRKの役割を果たすことができる場合)、 HKDF-Extractはスキップできますが、一般的なケースとの互換性のためにHKDF-Extractを適用することが推奨されます[ 3 ] : 5、特にrがアプリケーションで利用可能な場合はそうです。
HKDF-Expand ( PRF* ) は、 PRK [ 1 ] : 9–11 (または HKDF-Extract ステップがスキップされた場合は任意のランダムな鍵導出鍵)、[ 3 ] : 5オプションの情報 ( CTXinfo )、および長さ ( L ) を受け取り、長さLの出力鍵マテリアル ( OKM )を生成します。[ 1 ] : 9–11複数の OKM は、 CTXinfoに異なる値を使用することで、単一の PRK から生成できます。CTXinfo は、 HKDF-Extract で渡されるIKMとは「独立」している必要があります。[ 3 ] : 5 rと秘密のIKMに関する補助情報を知っている攻撃者が、 2 つ以上の HKDF-Expand コンテキスト ( CTXinfoで表される)で同じIKM (および拡張としてPRK )の使用を強制できたとしても、 OKMの出力は計算的に独立しています (互いに有用な情報を漏らしません)。[ 1 ]: 7-8
HKDF-Expandは、 PRKをキーとする可変出力長擬似乱数関数(PRF*)として動作し、[ 1 ]: 15は、8ビットカウンタiに追加されたメッセージ(指定されていない場合は空文字列)としてCTXinfoに対してHMACを呼び出します。1. [ 1 ] : 18 HMACへの後続の呼び出しは、前のHMAC出力をCTXinfoの先頭に追加し、iをインクリメントすることによって「フィードバックモード」で連鎖されます。[ 3 ] OKMは、HMACの基となるハッシュ関数の出力サイズ( kビット)の関数です。つまり、 SHA-256は、最大長さi × kビット(255 × 256ビット=8160バイト)まで、 k =256ビットのセグメントでOKMを出力し、それを目的の長さLに切り捨てます。[ 1 ] : 11
PRKが少なくとも所望の長さLである場合はHKDF-Expandを省略できますが、 OKMのさらなる「平滑化」のためにHKDF-Expandを適用することが推奨されます。[ 1 ] : 27 [ 3 ] : 6
HKDFは、様々なプロトコルやアプリケーションにおける構成要素として、また複数のKDFメカニズムの乱立を抑制するために、その開発者によって提案された。[ 3 ]: 1
これはRFC 5869 [ 3 ]で正式に記述されており、 2010年に発表された論文で詳細な分析が行われています。[ 1 ] NIST SP800-56Cr2 [ 4 ]は、パラメータ化可能な抽出・展開方式を規定しており、RFC 5869 HKDFはそのバージョンであることを指摘し、推奨事項の抽出・展開メカニズムの根拠としてその論文を引用しています。
HKDFは、エンドツーエンド暗号化メッセージングのSignalプロトコルで使用され、トリプル楕円曲線ディフィー・ヘルマンハンドシェイク(X3DH)鍵合意プロトコルと連携してメッセージキーを生成します。 [ 5 ] Signalの「セキュア値回復」[ 6 ]と「Sealed Sender」はHKDFに基づいています。[ 7 ] HKDFは、 Noiseプロトコルフレームワーク、メッセージレイヤーセキュリティの主要コンポーネントであり、IPsecインターネット鍵交換やTLS 1.3などの広く展開されているプロトコルで使用されています。[ 5 ]
HKDFの「多目的」な性質は、鍵の抽出、鍵の拡張、鍵の階層化を必要とするアプリケーション、鍵ラッピング、鍵交換、擬似乱数生成器、およびパスワードベースの鍵導出スキームに対応することを目的としています。[ 8 ]
C#、Go、[ 9 ] Java、JavaScript、Perl、PHP、[ 10 ] Python、Ruby、Rust、その他のプログラミング言語向けにHKDFの実装があります。RFC6234は、セキュアハッシュ標準に基づいたHKDFの参照C実装を規定しています。[ 11 ]
#!/usr/bin/env python3import hashlib import hmac# 注: ここでは使用されていませんが、展開が SHA256 の場合、抽出フェーズで SHA512/256 を使用すると、より強力な抽出保証が得られます。# hash_function_extract = hashlib.sha512 # RFC5869 には SHA-1 テストベクトルが含まれていますhash_function = hashlib.sha256def hmac_digest ( key : bytes , data : bytes ) -> bytes : return hmac . new ( key , data , hash_function ) . digest ()def hkdf_extract ( salt : bytes , ikm : bytes ) -> bytes : if len ( salt ) == 0 : salt = bytes ([ 0 ] * hash_function () . digest_size ) return hmac_digest ( salt , ikm )def hkdf_expand ( prk : bytes , info : bytes , length : int ) -> bytes : t = b "" okm = b "" i = 0 while len ( okm ) < length : i += 1 t = hmac_digest ( prk , t + info + bytes ([ i ])) okm += t return okm [: length ]def hkdf ( salt : bytes , ikm : bytes , info : bytes , length : int ) -> bytes : prk = hkdf_extract ( salt , ikm ) return hkdf_expand ( prk , info , length )okm = hkdf ( salt = bytes . fromhex ( "000102030405060708090a0b0c" ), ikm = bytes . fromhex ( "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" ), info = bytes . fromhex ( "f0f1f2f3f4f5f6f7f8f9" ), length = 42 , ) assert okm == bytes . fromhex ( "3cb25f25faacd57a90434f64d0362f2a" "2d2d0a90cf1a5a4c5db02d56ecc4c5bf" "34007208d5b887185865" )# 長さゼロのソルトassert hkdf ( salt = b "" , ikm = bytes . fromhex ( "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" ), info = b "" , length = 42 , ) == bytes . fromhex ( "8da4e775a563c18f715f802a063c5a31" "b8a11f5c5ee1879ec3454e5f3c738d2d" "9d201395faa4b61a96c8" )ランダム性抽出器は、十分な最小エントロピーのソースを、統計的に一様に近い出力にマッピングするアルゴリズムです。ランダム性抽出は、複雑性理論と理論計算機科学において中心的かつ遍在する概念となり、無数の応用と、他の概念との驚くべき統一的なつながりを持っています。暗号学もまた、この概念から大きな恩恵を受けています。ランダム性抽出器の暗号学的応用は、一方向関数からの擬似乱数生成器の構築から、ノイズの多い弱いソースからの暗号機能の設計(量子暗号への応用を含む)、漏洩耐性および暴露耐性暗号、循環暗号、完全準同型暗号などの分野における最近の進歩まで多岐にわたります。ランダム性抽出器は、特に鍵導出関数の構築において、実用的な応用においても重要な暗号学的用途を見出しています。これらのアプリケーションの多くにおいて、ランダム性抽出器の決定的な特性、すなわち出力が統計的に一様分布に近いという特性は緩和され、計算上の不可分性で置き換えられることがあります。このような緩和された保証を提供する抽出器は「計算抽出器」と呼ばれます。本講演では、計算抽出器の理解と適用性に関する最近の進歩について、特に重要な導出関数の構築におけるその役割に焦点を当てて解説します。
{{cite book}}: CS1メンテナンス: 場所の発行元が見つかりません (リンク)