40文字のソルトを生成するページを作成し、入力されたパスワードを取得して、このPHPコードを使用してハッシュを作成し、以下を使用してソルトとハッシュされたパスワードをデータベースに挿入します(これは関連する行です)。
$hashedpassword = sha1($password . $salt);
次に、ログインプロセスで、入力したパスワードを使用し、dbからsaltを取得して、同じコード行を使用してhasを作成します(これも関連する行です)。
$hashedpassword = sha1($storedPassword . $storedSalt);
ただし、保存されているハッシュパスワードと一致しないため、エラーが発生したかどうかを確認するために、情報を「エコー」して、何が起こっているのかを読み取れるようにしました。
$storedSalt = $row_rsSaltLookup['salt'];
$storedPassword = $row_rsSaltLookup['password'];
$storedHashedPassword = $row_rsSaltLookup['hashedpassword'];
//use the stored salt to hash the user's submitted password
$hashedpassword = sha1($storedPassword . $storedSalt);
echo "Salt: " . $storedSalt . "<br/>";
echo "Stored Password: " . $storedPassword . "<br/>";
echo "Stored Hashed Password: " . $storedHashedPassword . "<br/>";
echo "Pre-hash: " . $storedPassword . $storedSalt . "<br/>";
echo "Hashed Password: " . $hashedpassword . "<br/>";
echo "re-Hashed Password: " . sha1($storedPassword . $storedSalt) . "<br/>";
echo "re-Hashed Password 2: " . sha1($storedPassword . $storedSalt) . "<br/>";
if($storedHashedPassword != $hashedpassword) {
echo "NO MATCH";
}else{
echo "MATCH";
}
exit();
そして私は結果としてこれを得る:
Salt: 4039505cc4efae2
Stored Password: ujwiervdhyf
Stored Hashed Password: aa27c197dfd88cd2f0d46b84d259016a15bd3954
Pre-hash: ujwiervdhyf4039505cc4efae2
Hashed Password: b06193ed26617c449902ac813376cf0c33bec3d1
re-Hashed Password: b06193ed26617c449902ac813376cf0c33bec3d1
re-Hashed Password 2: b06193ed26617c449902ac813376cf0c33bec3d1
NO MATCH
この例では、「ソルト」が生成され、アカウントが作成されてハッシュされたときのパスワード(保存されたパスワード)と一緒にまとめられます(保存されたハッシュされたパスワード)。ログインに行くとき、dbからソルトを取得し、ログイン時にパスワードに追加し、それをハッシュして、保存されているハッシュされたパスワードと比較します。これは同じである必要がありますか?ハッシュが一致しない理由がわからないので、どこが間違っていたのか疑問に思います。