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