3

関数を使用して作成された 2 つのパスワード ハッシュがあるpassword_hash場合、それらが同じ基本パスワードからのものであるかどうかをどのように確認できますか? 毎回違う塩を使っているのは知っています。私はプレーンテキストを持っていません。

たとえば $2y$10$M6CnjqaxuUKNhg84T8NpLeylkUrvP1pzoZNhBWfpSzP2zJneuS1re$2y$10$ZSlQNIbsLWfj7JLCSkvFLeS/adH.KnGZTgA1BcvyPXl7BEn7GhREO両方とも hashing から来ましたtest。これら 2 つのハッシュをパラメーターとして指定した場合に true を返す関数を作成するにはどうすればよいですか?

これは可能ですか?

そう:

<?php
function check_hashes($hash1, $hash2) {
(some code)
}
echo strval(check_hashes('$2y$10$M6CnjqaxuUKNhg84T8NpLeylkUrvP1pzoZNhBWfpSzP2zJneuS1re', '$2y$10$ZSlQNIbsLWfj7JLCSkvFLeS/adH.KnGZTgA1BcvyPXl7BEn7GhREO'));
echo strval(check_hashes('$2y$10$ZSlQNIbsLWfj7JLCSkvFLeS/adH.KnGZTgA1BcvyPXl7BEn7GhREO', '$2y$10$LoUOu3kt7zm1YZI1PtAsD.yzWF0b9jqOaAH64lK51VtgqRJZBgtO6'));
?>

出力します:

TRUE
FALSE
4

2 に答える 2

6

いいえ、パスワードを知っていない限り、2 つのハッシュが同じパスワードに属しているかどうかを確認することはできません。可能であれば、これは基本的にpassword_hash関数を使用する目的に失敗します。

パスワードがわかっている場合は、次の方法で簡単にpassword_verifyパスワードを確認できます。

$res1 = "$2y$10$ZSlQNIbsLWfj7JLCSkvFLeS/adH.KnGZTgA1BcvyPXl7BEn7GhREO";
$res2 = "$2y$10$M6CnjqaxuUKNhg84T8NpLeylkUrvP1pzoZNhBWfpSzP2zJneuS1re";
var_dump(password_verify("test", $res1)); // returns true
var_dump(password_verify("test", $res2)); // returns true

ご覧のとおり、両方のハッシュがtruewithpassword_verify()メソッドを提供するため、2 つのハッシュが同じパスワードに属しているかどうかを確認する必要はありません。そして、そうする場合、上記のロジックを使用して、次のような関数を構築できます。

function belongs_to_password() {
  $args = func_get_args();
  $str  = array_shift($args);
  foreach ($args as $hash) {
    if (!password_verify($str, $hash)) return false;
  }
  return true;
}

上記の関数を使用して、この関数に渡されたハッシュがすべて同じパスワードのものであるかどうかを確認できます。そして、次のように使用できます。

$res1 = "$2y$10$ZSlQNIbsLWfj7JLCSkvFLeS/adH.KnGZTgA1BcvyPXl7BEn7GhREO";
$res2 = "$2y$10$M6CnjqaxuUKNhg84T8NpLeylkUrvP1pzoZNhBWfpSzP2zJneuS1re";
var_dump(belong_to_password("test", $res1, $res2)); // returns true
于 2013-12-27T17:43:29.763 に答える
1

ソルトとハッシュの方法論に関する情報は、ハッシュにエンコードされます。これによりpassword_verify()、salt に関する別の知識がなくても作業できます (つまり、salt をどこかのデータベースに保存する必要はありません)。

pasword_verify()ドキュメントのこのセクションに注意してください。

password_hash() は、返されるハッシュの一部としてアルゴリズム、コスト、ソルトを返すことに注意してください。したがって、ハッシュを検証するために必要なすべての情報が含まれています。これにより、検証機能は、ソルトまたはアルゴリズム情報用に別のストレージを必要とせずにハッシュを検証できます。

password_verify()そのため、単純に両方のハッシュに対して実行できます。

$hash1_verified = password_verify('test', $hash1);
$hash2_verified = password_verify('test', $hash2);

これらの両方が true を返す場合、それらは両方とも のハッシュですtest

ベース ワードを任意のサイズのハッシュの配列と比較して、すべてのハッシュが同じベース ワードに由来することを確認する関数は、次のようになります。

function hash_base_matches_all_hashes($base, $hash_array) {
    for($i = 0; $i < count($hash_array); $i++) {
        if (false === password_verify($base, $hash_array[$i]) {
            return false;
        }
    }
    return true;    
}
于 2013-12-27T17:40:13.357 に答える