PBKDF2
PBKDF2は、HMACを疑似乱数関数として用いるとき、導出鍵が衝突する異なるパスワードの組を容易に得ることが可能である。HMACの中で用いられるハッシュ関数のブロック長よりパスワードが長いとき、パスワードをハッシュ化したものをパスワードとして用いる。例えば、疑似乱数関数として、HMAC-SHA1を用いると、
パスワード: plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd
は、
SHA1 (16進数): 65426b585154667542717027635463617226672a
SHA1 (ASCII): eBkXQTfuBqp'cTcar&g*
となる。よって、PBKDF2-HMAC-SHA1は、次の2つの異なるパスワード
"plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd"
"eBkXQTfuBqp'cTcar&g*"
から、ソルトやストレッチングに関係なく、同じ鍵を導出する。例えば、
PRF: HMAC-SHA1
ソルト: A009C1A485912C6AE630D3E744240B04
ストレッチング回数: 1,000回
導出鍵の長さ: 16バイト
とすると、2つの関数
は、同じ導出鍵17EB4014C8C461C300E9B61518B9A18Bを生成する。ただし、パスワードのハッシュ値を得るためには、パスワードも得る必要があるため、導出鍵の衝突は、PBKDF2やHMACの脆弱性を示唆するものではない。
PBKDF2は、ストレッチング回数を調整することで、計算時間を変動させること可能である。しかしながら、短いコード量、少ないメモリ量で実装できるため、ASICやGPUを用いた総当たり攻撃に弱い。パスワードハッシュ関数のbcryptは、計算時間は固定であるものの、計算に多くのメモリ量を必要とするため、PBKDF2より総当たり攻撃に強い。その後に開発された鍵導出関数のscryptは、任意の大きさのメモリ量を使うことができ、ASCIやGPUによる攻撃に対する耐性が高い。
安全なパスワードハッシュ化手法を開発することを目的として、2013年にパスワードハッシュ競技会(英語版)が開催された。2015年7月20日にパスワードハッシュ関数Argon2の優勝が決まり、他に4つの関数Catena、Lyra2、yescryptおよびMakwaが特別賞として選ばれた。