タイトル通り。
ストレッチングってなんぞやという人はまずはそちらを調べた後、再訪していただければと。
さっそく本題
PHPのpassword_hash関数の第3引数には配列形式でoptionを指定することができます。
optionの中にcostというパラメータがあります。
password_hashのドキュメント1を読むと以下のようにあります。
利用するアルゴリズムのコストを表します。
省略した場合のデフォルトは 10 です。
この値でもかまいませんが、 ハードウェアの性能が許すならもう少し高くすることもできます。
デフォルトが10だからといって、反復処理(ストレッチング)の回数が10回というわけではありません。
ただ、password_hash関数のドキュメント内にはこの10の値が具体的に何の値かは書いていません。
password_hash関数はcrypt関数のラッパー関数であり、コストの詳細についてはcrypt関数のドキュメント2を参照せよとありました。
コストについての記述を確認すると、以下のようにあります。
2 桁のコストパラメータは反復回数の 2 を底とする対数で、 これは Blowfish ベースのハッシュアルゴリズムで使います。
なんのこっちゃとなった方(特に文系出身エンジニア)のために簡単に説明すると以下の計算式で反復回数は計算されます。
2の(コストパラメータ)乗 = 反復回数
つまり、コストが10のときは、2の10乗で1024回実施されるというわけですね。
おまけ
NISTのガイドライン3では、ストレッチングは最低でも10,000回するべき(SHOULD)とあります。
なので、それを満たそうと思うとコストの値は14(16384回)以上に指定するべきですね。
もちろんサーバー負荷なども考慮する必要があるので、必ずしも10,000回以上にする必要はありませんが。