やりたいことはこんな感じに
$res_5a = crypt($password, '$6$rounds=5000$'.$salt.'$');
$res_25 = crypt($password, '$6$rounds=2500$'.$salt.'$');
$res_5b = crypt($res_25, '$6$rounds=2500$'.$salt.'$');
echo ($res_5a==$res_5b); //should be true
$res_25 文字列で遊んでみましたが、まだ欲しい結果が得られません。私は crypt() がそれを使って重要なことをしていると思い、これを行う簡単な方法があるかどうか疑問に思います。
これを次のように使用するつもりです。ユーザーが登録すると、パスワードは 5k ラウンドを使用して暗号化され、結果が DB に格納されます (5k は単なる例です。十分に安全であると仮定しましょう)。ソルトは、レインボー テーブルを使用できないようにするのに役立ちますが、ラウンドはブルート フォースから保護します。DB が盗まれた場合、パスワードを解読することはできず、攻撃者は、ユーザーが同じパスワードを使用できた可能性のある他の場所でこれらのパスワードを使用できなくなります。
私たちのサイト自体には、サインイン フォームに "remember me" 機能があります。使用しない場合は、すべて問題ありません。ユーザーの状態をサーバー セッションに保存しますが、最終的には終了します。ただし、ユーザーが「remember me」を使用したい場合、Cookie を使用して、ユーザーの認証に使用できるデータを保存する必要があります。Cookie に保存するものは何でも - 元のパスワードであろうと md5($res_5a) のようなものであろうと、攻撃者が $res_5a の値を盗み、Cookie 作成の背後にあるアルゴリズムを盗んだ場合、攻撃者はこのデータを使用して Cookie を偽造することができます。それはユーザーを認証します。
私がやりたかったのは、サインイン フォームで $res_25 Cookie を作成することです。そして、ページが読み込まれるたびに、サーバーはさらに 2.5k の反復を追加し、値が DB に保存されている $res_5a と一致するかどうかを確認します。そうすれば、$res_5a が盗まれた場合、攻撃者はユーザーの認証に必要な $res_25 の値を計算できなくなります。