暗号学において、PBKDF1およびPBKDF2(パスワードベース鍵導出関数1および2)は、計算コストが変動する鍵導出関数であり、総当たり攻撃に対する脆弱性を低減するために使用されます。[ 1 ]
PBKDF2 は、 RSA Laboratoriesの公開鍵暗号標準(PKCS) シリーズ、具体的には PKCS #5 v2.0の一部であり、インターネット技術タスクフォースの RFC 2898 としても公開されています。これは、最大 160 ビット長の派生鍵しか生成できなかった PBKDF1 に取って代わるものです。[ 2 ] 2017 年に公開されたRFC 8018 (PKCS #5 v2.1) では、パスワードハッシュに PBKDF2 を推奨しています。[ 3 ]
PBKDF2は、ハッシュベースメッセージ認証コード(HMAC)などの擬似乱数関数を入力パスワードまたはパスフレーズにソルト値とともに適用し、このプロセスを何度も繰り返して派生鍵を生成します。生成された鍵は、後続の操作で暗号鍵として使用できます。この追加の計算処理により、パスワードの解読がはるかに困難になり、これは鍵の拡張として知られています。
2000 年に標準が作成された時点では推奨される最小反復回数は 1,000 回でしたが、このパラメータは CPU 速度の向上に伴い時間とともに増加することが意図されています。2005 年のKerberos標準では 4,096 回の反復が推奨されました。[ 1 ] Apple はiOS 3で 2,000 回、iOS 4で 10,000 回を使用したと報告されています。[ 4 ]一方、LastPass は2011 年にJavaScriptクライアントで 5,000 回の反復、サーバー側ハッシュで 100,000 回の反復を使用しました。[ 5 ] 2023 年にOWASP はPBKDF2-HMAC-SHA256 で 600,000 回の反復、PBKDF2-HMAC-SHA512 で 220,000 回の反復を使用することを推奨しました。[ 6 ]

パスワードにソルトを追加すると、事前に計算されたハッシュ(レインボーテーブル)を攻撃に利用する能力が低下し、複数のパスワードを一度にすべてテストするのではなく、個別にテストする必要が生じます。公開鍵暗号標準では、ソルトの長さを少なくとも 64 ビットにすることを推奨しています。[ 7 ]米国国立標準技術研究所では、ソルトの長さを少なくとも 128 ビットにすることを推奨しています。[ 8 ]
PBKDF2には5つの入力パラメータがあります: [ 9 ]
どこ:
派生鍵DKの各hLenビットブロックT i は、次のように計算されます ( +マーク文字列連結を使用)。
関数Fは、連鎖した PRF のc回の反復のXOR ( ^ )です。最初の PRF 反復では、パスワードをPRF キーとして使用し、ソルトとiを連結したビッグエンディアン 32 ビット整数を入力として使用します。( iは 1 から始まるインデックスであることに注意してください。) 以降の PRF 反復では、パスワードをPRF キーとして使用し、前の PRF 計算の出力を入力として使用します。
どこ:
例えば、WPA2では以下が使用されます。
PBKDF1 はよりシンプルなプロセスを採用しています。最初のU (このバージョンではTと呼ばれます) はPRF(パスワード+ソルト)で生成され、後続の U は単にPRF(前のU )です。鍵は最終ハッシュの最初のdkLenビットとして抽出されるため、サイズ制限があります。[ 9 ]
PBKDF2 は、擬似乱数関数として HMAC を使用する場合に興味深い特性を持ちます。各ペア内で衝突が発生する、任意の数の異なるパスワードペアを簡単に構築できます。[ 10 ]指定されたパスワードが基となる HMAC ハッシュ関数のブロックサイズよりも長い場合、パスワードはまずダイジェストに事前ハッシュ化され、そのダイジェストがパスワードとして使用されます。たとえば、次のパスワードは長すぎます。
plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmdしたがって、HMAC-SHA1を使用する場合、SHA-1を使用して事前にハッシュ化され、次のようになります。
65426b585154667542717027635463617226672aこれはASCIIでは次のように表すことができます。
eBkXQTfuBqp'cTcar&g*これは、ソルトや反復回数に関係なく、PBKDF2-HMAC-SHA1がパスワードに対して同じキーバイトを生成することを意味します。
例えば、以下のように使用します。
以下の2つの関数呼び出し:
PBKDF2 - HMAC - SHA1 ( "plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd" 、... ) PBKDF2 - HMAC - SHA1 ( "eBkXQTfuBqp'cTcar&g*" 、... )同じ派生キーバイト()が生成されます。これらの派生キーの衝突はセキュリティ上の脆弱性を示すものではありません。パスワードのハッシュ17EB4014C8C461C300E9B61518B9A18Bを生成するには、元のパスワードを知っている必要があるためです。 [ 11 ]
PBKDF2 の弱点の 1 つは、反復回数を調整して任意の量の計算時間をかけることができる一方で、小さな回路と非常に少ない RAM で実装できるため、特定用途向け集積回路やグラフィックス処理ユニットを使用した総当たり攻撃が比較的安価になることです。[ 12 ] bcryptパスワードハッシュ関数はより多くの RAM を必要としますが (ただし、個別に調整することはできず、つまり、特定の CPU 時間に対して固定されています)、このような攻撃に対してはるかに強力です。[ 13 ]一方、より新しいscrypt鍵導出関数は任意の量のメモリを使用できるため、ASIC や GPU 攻撃に対してより耐性があります。[ 12 ]
2013年に、より耐性の高いアプローチを開発するためにパスワードハッシュコンペティション(PHC)が開催されました。2015年7月20日、Argon2がPHCの最終勝者に選ばれ、Catena、 Lyra2、yescrypt、Makwaの4つのパスワードハッシュ方式が特別に表彰されました。 [ 14 ]もう一つの選択肢はバルーンハッシュで、 NISTのパスワードガイドラインで推奨されています。[ 15 ]
総当たり攻撃を制限するために、パスワードの機密性を損なうことなく、各パスワード試行にオンラインでのやり取りを要求させることが可能です。これは、パスワード強化を実行するために、オブリビアス擬似乱数関数を使用することで実現できます。[ 16 ]これは、PBKDFの代替手段として、またはPBKDFの追加ステップとして実行できます。