1

さて、以下のコードはすべて私自身のものではありません。インターネットのチュートリアルに従っていますが、実行しようとするとパスワードが一致しないようです。データベースにあるものが login.php スクリプトに記述されている 64 文字に近くないため、パスワードのソルトにエラーがある可能性があると思います。何も思いつきません。コードは以下のとおりです。

register.php

// Create a 256 bit (64 characters) long random salt
// Let's add 'something random' and the username
// to the salt as well for added security
$salt = hash('sha256', uniqid(mt_rand(), true) . 'something random' . strtolower($username));

// Prefix the password with the salt
$hash = $salt . $password;

// Hash the salted password a bunch of times
for ( $i = 0; $i < 100000; $i ++ )
{
    $hash = hash('sha256', $hash);
}

// Prefix the hash with the salt so we can find it back later
$hash = $salt . $hash;

// carry on with registration code...

login.php

$email = $_POST['email'];
$password = $_POST['password'];

$con = mysql_connect("localhost", "redacted", "redacted", "redacted");

$sql = '
    SELECT
        `password`
    FROM `users`
        WHERE `email` = "' . mysql_real_escape_string($email) . '"
    LIMIT 1
    ;';

$r = mysql_fetch_assoc(mysql_query($sql));

// The first 64 characters of the hash is the salt
$salt = substr($r['password'], 0, 64);

$hash = $salt . $password;

// Hash the password as we did before
for ( $i = 0; $i < 100000; $i ++ )
{
    $hash = hash('sha256', $hash);
}

$hash = $salt . $hash;

if ( $hash == $r['password'] )
{
    session_start();
    header('Location: /quiz/index.php');
}

if( $hash != $r['password'] ){
    session_start();
    header('Location: /?error=4');
}

// end login script
4

2 に答える 2

1

一般的なエラーは、データベースフィールドの長さがすべての文字を格納するのに十分でない場合です。その場合、パスワードはユーザーが入力したものと同じになることはありません。

この種の機能については、関数が(まだ)期待どおりに機能するかどうかを確認する単体テストを常に作成してください。ある日、誰かがデータベースを変更し、ハッシュアルゴリズムを変更し、ソルトを変更します...そして誰もログインできなくなります。

于 2012-07-05T08:40:12.960 に答える