0

ユーザーのパスワードをハッシュする次のPHPスクリプトがありますが、ハッシュされた変数を元のパスワードと比較しようとすると、falseが返されます。

$hash=hash("whirlpool","hello");

if("hello"===$hash){echo "TRUE";}
else{echo "FALSE";}

誰かが私が間違っていることを知っていますか、またはこのコードを実際に正しく機能するように改善するために何ができますか?実際にこれを使用できるように、ハッシュは変数と同じである必要があります。

サイドノート:適切なサイズの暗号化を使用したいので(これが「ワールプール」アルゴリズムを使用している理由です)、md5、sha1などを使用したくないのです...

前もって感謝します。

4

3 に答える 3

2

値を次のように比較するべきではありません

if(hash('whirlpool', 'hello') === $hash) echo 'true';
else echo 'false';
于 2012-12-04T23:45:54.547 に答える
1

ハッシュを比較するときは、比較した値もハッシュしたいと思うでしょう。

$hashed_password = hash("whirlpool", "hello");
$input = "hello";

if (hash("whirlpool", $input) === $hashed_password) {
    echo "TRUE";
} else {
    echo "FALSE";
}

PS:本当にワールプールを使いたいのなら、を加えてください。また、 OWASPにあるベストプラクティスに従ってください。

于 2012-12-04T23:44:18.013 に答える
1

ハッシュ関数は一方向の暗号化アルゴリズムです(一方向とは、特定の出力から入力を計算できないことを意味します)。入力を受け取り、かなり長い数値を吐き出します(多くの場合、16進形式で表されます)。したがって、特定の入力にハッシュアルゴリズムを適用すると(この場合は「hello」にワールプールアルゴリズムを適用します)、ダイジェストが返されます(この場合、ダイジェストの16進文字列は0a25f55d7308eca6b9567a7ed3bd1b46327f0f1ffdc804dd8bb5af40e88d78b88df0d002a89e2fdbd5 明らかに、「hello」は「0a25f..」と同じではありません。ハッシュアルゴリズムを使用する一般的なシナリオは、データベースまたはその他の種類のIDストレージに保持されているパスワードを保護することです。したがって、特定のパスワードを比較する場合(例:

したがって、「hello」を以前に生成されたハッシュと比較する代わりに、「hello」のハッシュを以前に生成されたハッシュと比較したいとします。

$hash = hash("whirlpool","hello");
if(hash("whirlpool","hello") === $hash){
    echo "true";
}

送信されたパスワードを確認したい場合は、次のように記述できます。

$pw_stored = "0a25f..." //(... left out some chars) that's the hash you got from the db
if(hash('whirpool', $_POST['password']) === $pw_stored){ // $_POST['password'] is the password a user has entered in a login form 
    echo "true";
}
于 2012-12-05T00:07:04.553 に答える