0

やりたいことはこんな感じに

$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 の値を計算できなくなります。

4

1 に答える 1

1

序章

同じになることはありません... string2回目の呼び出しの後にオリジナルをハッシュしなくなるためcrypt...どういう意味ですか

$salt = "salt";
$password = "password";
$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.'$');


var_dump($password,$res_5a,$res_25,$res_5b);

出力

string 'password' (length=8) <----------- Original Text

string '$6$rounds=5000$salt$IxDD3jeSOb5eB1CX5LBsqZFVkJdido3OUILO5Ifz5iwMuTS4XMS130MTSuDDl3aCI6WouIL9AjRbLCelDCy.g.' (length=106)
       |------------------|
         Custom Header for 500 rounds 

string '$6$rounds=2500$salt$e9Ui0CoNFtgwugogNU.uUwCKW8hAeW4td1ySwKf34FqEwMf2Gpk3zu5Y43R5a2AaI/5lpPigk1rSTme.uotYL1' (length=106)
       |------------------|
          Custom header would be added .. you are no onder encoding password

string '$6$rounds=2500$salt$JAq/IG3jH6w7r6S/AT/UhMpgLopLOWLbilJWY9z39s6To109QJvLxZJUkV99arSOSumFbS3Fy00CRAYrAd9Pp1' (length=106)
       |------------------|
         Even Final output would not be same as $6$rounds=5000$salt

解決

より良い方法は、セキュリティトークンハッシュを使用し、ユーザー名とパスワードをシステムに保存しないことです

同じ環境にいることを確認するために、トークンのハッシュの組み合わせに , がUser Agent含まれるOS場合がありますScreen Resolution

また、Http_only Cookieを使用してみてくださいセキュリティへの影響の例

  session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
                                                   ^----- Http Only  
于 2012-11-12T22:13:13.277 に答える