2

私は現在、PHP の新しい(v5.5 の一部としてリリースされる) パスワード処理 API を利用する Web アプリケーションを実装しています。本当に良いと思いますpassword_get_info()が、与えられたハッシュの計算で使用されるソルト値を返さない理由を誰かが知っているのだろうか? RFCは、問題の関数がソルトを返さないことを明示的に述べていますが、その理由についての説明はありません。

2 番目の要素は「オプション」です。これには、使用されるソルトを除いて、ハッシュ アルゴリズムによって使用されるオプションが含まれます。

ユーザーのパスワードの有効期限が切れたときに、現在のパスワードと同じパスワードを再送信していないことを確認する必要があるためです。これを行う唯一の方法は、新しいパスワードをハッシュし、同じアルゴ、コスト、およびソルトを使用して、結果のハッシュを現在 DB にあるものと比較することです。アルゴとコストはpassword_get_info()関数によって返されますが、ソルトでは返されません。現時点ではsubstr($hash, 7, 22)、ソルト値を取得するために使用していますが、これは明らかにアルゴリズム固有のものであり、それ以外の場合は非常に使いやすく強力な API を使用する目的を無効にします (新しいアルゴリズムの使用を開始すると、ソルトの位置が非常にうまくいく可能性があります)。変化する)。

編集:私は馬鹿でした.ハッシュを再構築して結果のハッシュを比較する必要はありませんでしたがpassword_verify()FALSE. それは私が病気で疲れているときに働くことを教えてくれます!

4

2 に答える 2

2

それどころか、この情報を知る必要はありません。入力を以前のハッシュと比較するだけです (これにより、ユーザーが持っていたすべてのハッシュの記録を保存し、それらすべてを反復処理してpassword_verify、新しいパスワード入力に対して結果をチェックすることを意味します)。
Bcrypt はそのように便利です。password_hash実際、これは、使用する、または使用するアルゴリズムの必須の動作ですpassword_verify。そうしないと、同じ方法で比較できず、機能が変更されるためです。

password_verify(string $password, string $hash):
    $hash = crypt($plaintext, '$2y$' . $workrate . '$' . $salt)
    => $2y$<workrate>$<salt><hash> as result,

ただし、本当に bcrypt ハッシュのソルトを見つける必要がある場合 (これがpassword_hash使用されます)、ハッシュの最初の 22 文字から設定を差し引いたものを取得します (繰り返しますが、入力を比較する必要があるだけです)。ハッシュに)。

理想的にはpassword_hash、動的ワークレートを処理できるクラスまたは関数内にラップし、オプションを変更する必要があります (たとえば、ハッシュがワークレート 12 として保存されている場合、ハッシュの経過時間に基づいて異なるワークレートを使用し、推奨することができます)。ユーザーがパスワードを更新する必要があります)。

CSPRNGによって生成されるため、関数はソルトを返しません。別のパラメーターとして比較する必要はありません (ハッシュの一部であるため)。

于 2013-05-07T19:59:11.290 に答える