まず、その推奨事項に疑問を呈します(年に基づいてコストを調整します)。コストは、現在の日付ではなく、ハードウェアの速度に基づいている必要があります。現在から 2015 年までの間にサーバーをアップグレードしなければ、コストを上げる理由はありません。あなたがすることは、すでに遅いプロセスを遅くすることだけです。
そうは言っても、ほとんどの用途で1秒という推奨事項にも疑問があります. 非常に機密性の高い情報を扱っている場合は、1 秒 (またはそれ以上) で十分です。しかし、平均的な Web サイトの場合、通常は 0.25 ~ 0.5 秒をお勧めします。場合によってはもっと下げることもできますが、強い正当な理由がなければそうはなりません。
さて、質問自体に。crypt()
またはを使用するpassword_hash()
と、反復回数が戻りハッシュ形式で格納されます。実は塩も同じです。したがって、ハッシュを計算するために必要なすべての情報が含まれています!
そして、これらの API (または私が維持しているポリフィル: password-compat ) のいずれも使用していない場合は、なぜ使用していないのか不思議に思う必要があります。独自のパスワード暗号を発明しないでください。強い理由がない限り、ネイティブ ハッシュを使用するライブラリ (phpass など) を使用しないでください (特定の政府のコンプライアンス上の理由、または PHP <= 5.2 との互換性のため)。
一般に、bcrypt は現在最も強力なハッシュ形式であると考えられています。SCrypt はより強力ですが、いくつかの問題があり、まだ非常に新しいものです (PHP コアではまだ利用できません)。したがって、bcryptを使用してください...
password_hash()
APIには、あなたが求めていることを行うためのメカニズムがあります: password_needs_rehash()
. 基本的に、ハッシュと現在使用しているオプションを渡すと、再ハッシュする必要があるかどうかがわかります。
if (password_verify($password, $hash)) {
if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 14])) {
$hash = password_hash($password);
update_password_in_database($hash);
}
$loggedin = true;
}
詳細については、password_hash() の RFC を参照してください (多数の情報源からデータを収集し、RFC に参照を含めました)。
編集 - @AnotherParker のコメントをフォローアップ:
サーバーをアップグレードしなかったからといって、犯罪者がクラッキングボックスのアップグレードをやめることはありません。オフライン攻撃を阻止するには、時間の経過とともに作業パラメーターを増やす必要があります。
ある種の真実。確かにそうですが、私が上で話していたことの要点を逃しています。
ハッシュ関数のコスト パラメータは、時間と労力のトレードオフです。各ハッシュに追加の労力を追加するために、ある程度の時間をトレードオフします。同じハードウェアでは、時間がかかるほど、より多くの作業が発生します。より多くの作業を生み出すもう 1 つの方法は、より高速なハードウェアを入手することです。
しかし、推奨されるのは、現在のハードウェアでハッシュ関数をテストし、合理的に作成できる限り高価にすることです。サーバー ハードウェアをアップグレードしない限り、0.5 秒が現在許容できる最大値である場合、コストの増加はどのように役立つでしょうか? つまり、重要であるとすでに決めている最大時間制限を破ることになるため、そうではありません。
したがって、すでに弱いハッシュを生成していない限り、サーバーの機能を向上させずに作業パラメーターを増やすことはできません。
また、件名に関するこの回答を確認してください