PBKDF2
暗号化では、 'PBKDF1' と 'PBKDF2' ( 'パスワードベースのキー導出関数2' )は、[[キー導出関数]暗号化された鍵の[ブルートフォース攻撃]への脆弱性を減らすことを目的としています。
PBKDF2はRSA Laboratories Public-Key Cryptography Standards(PKCS)シリーズ、特にPKCS#5 v2.0の一部であり、[Internet Engineering Task Force]のRFC 2898としても公開されています。 PBKDF1に代わるもので、160ビットまでの派生キーしか生成できませんでした。 2017年に発行されたRFC 8018では、Argon2のような新しいパスワードハッシング関数がPBKDF2などの古い関数の弱点に対処するように設計されていても、パスワードハッシュにPBKDF2を推奨しています。
目的と操作[編集]
PBKDF2は暗号化とともに入力パスワードまたはパスフレーズにハッシュベースのメッセージ認証コード(HMAC)などの[[擬似ランダム関数] salt]]の値を計算し、このプロセスを何回も繰り返して "派生キー"を生成し、その後の操作で暗号キーとして使用することができます。追加された計算作業はパスワードクラッキングをはるかに困難にし、キーストレッチとして知られています。
標準が2000年に書かれたとき、推奨される最小繰り返し回数は1000回でしたが、CPU速度が増加するにつれてパラメータは時間とともに増加することを意図しています。 2005年現在、Kerberos標準では4096回の反復が推奨されています。Apple iOS 3は2000年、iOS 4は2011年に使用されましたが、LastPassはJavaScriptクライアントで5000回、サーバー側でハッシュ処理を繰り返しました。
パスワードに塩を追加すると、事前計算されたハッシュ([[虹彩テーブル])を攻撃に使用する能力が低下し、複数のパスワードを一度にまとめてテストする必要がなくなります。この規格では、少なくとも64ビットの塩長を推奨しています。
キー導出プロセス[編集]
PBKDF2キー導出関数には5つの入力パラメータがあります。
DK = PBKDF2(PRF、パスワード、ソルト、c、dkLen)
ここで:
- PRF は、出力長 hLen を持つ2つのパラメータの擬似乱数関数です(例えば、キー付きHMAC)
- Password は派生キーの生成元となるマスターパスワードです
- 塩 は、暗号塩として知られる一連のビットです。
- c は、必要な反復数です。
- dkLen は派生キーの望ましい長さです
- DK は生成された派生キーです
各「hLen」 - ビットブロックT i </ sub>は、 ( || </ code>マーキング文字列連結を用いて)以下のように計算される。
DK = T 1&lt; / sub&gt; || T <sub2 </ sub> || ... || T sub dklen / hlen </ sub>は、 T <sub </ sub>は、 = F(パスワード、塩、c、i)
関数「F」は、連鎖PRFの「c」反復の[xor](^)です。 PRFの最初の反復は、PRFキーとして「パスワード」を使用し、ビッグエンディアンの32ビット整数としてエンコードされた「 'i」で連結された「ソルト」を使用します。 (「i」は1から始まるインデックスです。)PRFの後続反復では、PRFキーとして「パスワード」を使用し、前回のPRF計算の出力を塩として使用します。
F(Password、Salt、c、i)= U <sub1> ^ U&lt; sub2&gt; ^ ... ^ U&lt; sub&gt;&lt; / sub&gt;
ここで: U 1 </ sub> = PRF(パスワード、塩|| INT_32_BE(i)) U 2 </ sub> = PRF(パスワード、U 1 sub1) ... U </ sub> = PRF(Password、U c-1 / sub)
たとえば、WPA2では次のものが使用されます。
DK = PBKDF2(HMAC-SHA1、パスフレーズ、ssid、4096,256)
HMACの衝突[編集]
HMACを擬似ランダム関数として使用する場合、PBKDF2は興味深い特性を持っています。異なるパスワードに対して任意の数の結果の衝突を簡単に構築することは可能です。提供されたパスワードが基礎となるHMACハッシュ関数のブロックサイズよりも長い場合、パスワードは最初にダイジェストにプリハッシュされ、代わりにそのダイジェストがパスワードとして使用されます。たとえば、次のパスワードが長すぎます。
- 'パスワード:' &lt; code&gt; plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd&lt; / code&gt;
SHA-1を使用して以下のように事前ハッシュされる(例えば、HMAC&lt; sha1&lt; / sub>を使用する場合)
- 'SHA1' (16進数):&lt; code&gt; 65426b585154667542717027635463617226672a&lt; / code&gt;
これはASCII形式で表すことができます:
- 'SHA1' (ASCII):&lt; code&gt; eBkXQTfuBqp'cTcar&g *&lt; / code&gt;
これは、PBKDF2 <hmac>サブクラスが、パスワードに対して同じキーバイトを生成します。
- "plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd"
- "eBkXQTfuBqp'cTcar&g *"
ハッシュ関数(例えば、sha1、sha256)、塩、または反復に関わらず。
たとえば、以下を使用します。
- 'PRF' :PBKDF2&lt; sub&gt; HMAC-SHA1&lt; / sub&gt;
- 'Salt:' A009C1A485912C6AE630D3E744240B04
- '反復:' 1,000
- '希望するキーの長さ:' 16バイト
次の2つの関数呼び出し:
PBKDF2&lt; HMAC-SHA1&gt;( "plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd"、...) PBKDF2&lt; HMAC-SHA1&gt;( "eBkXQTfuBqp'cTcar&g *"、...)
同じ派生キーバイト(<code> 17EB4014C8C461C300E9B61518B9A18B </ code>)を生成します。これらの派生したキーの衝突はセキュリティの脆弱性を表すものではありません。パスワードの「ハッシュ」を生成するためには元のパスワードを知っていなければなりません。衝突の存在は単なる好奇心になります。
PBKDF2の代わり[編集]
PBKDF2の弱点の1つは、反復回数は任意の計算時間を取るように調整することができますが、小さな回路と非常に少ないRAMで実装できることです。[[application-特定の集積回路]またはグラフィックス処理装置を比較的安価に使用することができます。 bcryptキー導出関数は、より大量のRAMを必要とします(ただし、CPU時間に応じて別々にチューニングすることはできません)。このような攻撃に対しては少し強くなりますが、 [scrypt]]キー導出関数は、任意に大量のメモリを使用することができ、したがってASICおよびGPU攻撃に対してより耐性があります。