1

と の 2 つの機能がHashPassword()ありValidatePasswordます。

1 つ目は、サインアップ フォームで指定されたパスワードを動的ソルトでハッシュし、2 つ目はパスワードを検証します。

基本的に、パスワードハッシュが一致しないかどうかを確認しています。ログインフォームでValidatePassword()関数を呼び出すときにハッシュをエコーアウトしてテストし、ValidatePassword()比較のために書き込み場所でハッシュを分割していることを確認しましたが、それらを比較すると、別のハッシュがエコーアウトされます。

よりよく説明するために、おそらく両方の関数を見る方が簡単です。

<?php

// hashes a users password along with a dynamic salt
// dynamic salt is stored with users password and is seperated by a ;
function HashPassword($password){
    // creates a dynamic salt
    $DynamicSalt       = uniqid('', true);
    // hash the password given from user along with dynamic salt
    $HashedPassword    = hash('sha512', $password . $DynamicSalt);
    // combine the hashed password seperated by ; then the dynamic salt to store in database
    $final             = $HashedPassword.';'.$DynamicSalt; // this value is stored in database like: c29fc9e4acdd2962c4db3f108bee728cf015c8f6388ab2cd4f21e405f9d2f13b2d53a1ab8629aa21c3453906a98aff0d4b9a0e14bfc2c553a4f9c7c0c32fc58a;4f91cfc746b426.53641182
    return $final;
}

// validate password user entered ($password = password from user | $dbHashedPassword = hash from database)
function ValidatePassword($password, $dbHashedPassword){
    // we need to get the password hash before the salt, (fetch just the first 128 characters from database hash)
    $CorrectHash = substr($dbHashedPassword, 0, 128);
    // get the dynamic salt from end of sha512 hash (
    $DynamicSalt = substr($dbHashedPassword, 129, 151); // get just the dynamic salt part of the db hash
    // hash the password from user and the dynamic salt which we got from the end of the hash from database
    $TestHash    = hash('sha512', $password . $DynamicSalt);

    return ($CorrectHash == $TestHash);


    // WHEN I ECHO OUT THE THREE VARIABLES $CorrectHash, $DynamicSalt and $TestHash
    // THE $CorrectHash (from db, first 128 chars) is not the same as $TestHash
    // AND TO MAKE SURE I AM SPLITTING THE HASH AND DYNAMIC SALT InN THE CORRECT PLACE I ECHO OUT
    // $DynamicSalt and it is split in the correct place showing the 23 characters which the dynamic salt is 23 characters
    // BUT WHEN I COMBINE THE $password and $DynamicSalt in $TestHash it shows a completely different hash from the $CorrectHash (which we got and split from database)
}

?>

何が悪いのかわかりませんが、エコーアウトすると最初の128文字(sha512)、次に動的ソルト(23文字)が表示されるため、ハッシュと動的ソルトを正しい場所に分割しているようですが、エコーアウトするとき一致しない 2 つの 128 文字のハッシュ (これは、完全に異なるハッシュであることを意味します)。

4

2 に答える 2

2

すべてが正しければ、に追加するのをsubstr忘れただけです";" . $DynamicSalt$TestHash

ところで。これは、最初のデータベース正規化ルール「値はアトミックでなければならない」に違反しています。塩は別の畑に保管する必要があります。

于 2012-04-20T22:05:19.720 に答える
1

おそらく、テストしているハッシュをどのように分割しているかに関係があります。たとえば、151 文字の長さのソルトを取得しようとしているとします。

これを試して:

function ValidatePassword($password, $dbHashedPassword) {
    list($CorrectHash, $DynamicSalt) = explode(";",$dbHashedPassword,2);
    return $CorrectHash == hash("sha512",$password.$DynamicSalt);
}
于 2012-04-20T22:03:44.997 に答える