PBKDF2

PBKDF2(Password-Based Key Derivation Function 2)は、パスワードから暗号鍵を生成するための鍵導出関数です。その特徴は、計算コストを調整できる点にあり、総当たり攻撃に対する耐性を高めるために利用されます。

PBKDF2の歴史と目的



PBKDF2は、より前のPBKDF1の改良版として登場しました。PBKDF1では導出される鍵の長さが160ビットに制限されていたのに対し、PBKDF2はPKCS #5 v2.0(RFC 2898)として規定され、より柔軟な鍵長に対応しました。さらに、2017年にはRFC 8018(PKCS #5 v2.1)で、パスワードのハッシュ化にPBKDF2を利用することが推奨されました。

PBKDF2の主な目的は、パスワードやパスフレーズから生成される鍵を、解読困難にすることです。これは、HMACなどの疑似乱数関数とソルトを使用し、さらに「ストレッチング」という処理を繰り返すことで実現されます。ストレッチングとは、鍵導出処理を複数回繰り返すことで、計算量を増やし、攻撃者が鍵を解読するのを困難にする技術です。初期のPKCS #5 v2.0ではストレッチングの推奨回数は最低1000回でしたが、CPUの処理能力向上に伴い、推奨回数は増加傾向にあります。

例えば、RFC 4120では4096回、AppleのiOS 3では2000回、iOS 4では10000回のストレッチングが用いられています。LastPassのようなパスワード管理サービスでは、サーバ側で100,000回、クライアント側で5,000回のストレッチングを行っている事例もあります。

ソルトの役割



PBKDF2では、パスワードに加えてソルトを使用します。ソルトとは、ランダムな値であり、パスワードごとに異なるソルトを付加することで、同じパスワードでも異なるハッシュ値を生成します。これにより、攻撃者は複数のパスワードを一度に試行する、レインボーテーブル攻撃の効果を減少させることができます。

PKCS #5ではソルトの長さを最低64ビットアメリカ国立標準技術研究所(NIST)では128ビットを推奨しています。

鍵導出の処理



PBKDF2は、以下の5つの引数を受け取り、鍵を導出します。

`DK = PBKDF2(PRF, Password, Salt, c, dkLen)`

ここで、

`PRF` は、疑似乱数関数(HMACなど)
`Password` は、マスターパスワード
`Salt` は、ソルト
`c` は、ストレッチング回数
`dkLen` は、導出鍵のビット
`DK` は、導出された鍵を表します。

導出鍵は、hLenビットのブロックTiを連結することで構成されます。各ブロックTiは、関数Fによって生成されます。

`DK = T1 + T2 + ... + TdkLen/hLen`

`Ti = F(Password, Salt, c, i)`

関数Fは、PRFをc回繰り返したXOR演算です。

`F(Password, Salt, c, i) = U1 ^ U2 ^ ... ^ Uc`

最初のPRFの入力は、Passwordを鍵とし、Saltと32ビットの整数i(ビッグエンディアン)を連結したものです。2回目以降のPRFの入力は、前回PRFの出力値です。

`U1 = PRF(Password, Salt + INT_32_BE(i))`
`U2 = PRF(Password, U1)`
`...`
`Uc = PRF(Password, Uc-1)`

例えば、WPA2では、以下のようにPBKDF2を利用しています。

`DK = PBKDF2(HMAC-SHA1, passphrase, ssid, 4096, 256)`

PBKDF1は、PBKDF2よりも単純な鍵導出関数であり、導出鍵の長さが制限されるという欠点があります。

HMACの衝突について



PBKDF2はHMACを疑似乱数関数として利用する場合、異なるパスワードから同一の鍵が生成される可能性があります。これは、パスワードがHMACで使用されるハッシュ関数のブロック長を超える場合に起こりえます。その場合、長いパスワードのハッシュ値がパスワードとして使用されるため、元のパスワードとは異なる短いパスワードでも同じ鍵が生成されます。

ただし、この現象はPBKDF2やHMACの脆弱性を示すものではありません。鍵の衝突を発生させるためには、元の長いパスワードを知る必要があるためです。

PBKDF2の代替技術



PBKDF2は、ストレッチング回数を調整することで計算時間を変動させることができますが、実装が容易なため、ASICやGPUを用いた総当たり攻撃に弱いという欠点があります。これに対し、bcryptは計算時間が固定であるものの、多くのメモリを必要とするため、PBKDF2よりも総当たり攻撃に強いとされています。

さらに、scryptは任意のメモリ量を使用でき、ASICやGPUに対する耐性が高いとされています。

安全なパスワードハッシュ化手法を開発する目的で、2013年にパスワードハッシュ競技会が開催されました。その結果、Argon2が優勝し、Catena、Lyra2、yescrypt、Makwaが特別賞に選ばれました。

まとめ



PBKDF2は、パスワードから鍵を生成する上で重要な技術であり、その仕組みや限界を理解することは、セキュリティ対策を講じる上で不可欠です。近年では、より安全な代替技術が登場しており、それらを適切に選択することも重要です。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。