2

次のコードを使用して、パスワードをmysqlに保存します

    if (!$errors) {
    // include the connection file
    require_once('connection.inc.php');
    $conn = dbConnect('write');
    // create a salt using the current timestamp
    $salt = time();
    // encrypt the password and salt
    $pwd = sha1($password, $salt);
    echo $pwd;
    // prepare SQL statement
    $sql = 'INSERT INTO users (username, salt, pwd)
            VALUES (?, ?, ?)';
    $stmt = $conn->stmt_init();
    $stmt = $conn->prepare($sql);
    // bind parameters and insert the details into the database
    $stmt->bind_param('sis', $username, $salt, $pwd);
    $stmt->execute();
    if ($stmt->affected_rows == 1) {
        $success = "$username has been registered. You may now log in.";
    } elseif ($stmt->errno == 1062) {
        $errors[] = "$username is already in use. Please choose another username.";
        } else {
            $errors[] = 'Sorry, there was a problem with the database.';
        }

}

パスワード フィールド pwd は CHAR 40 として定義されています。調べると、次の内容が含まれていることがわかります。

ƒ7Ž{9‰ù|EòsŒs”ºþ

どんなパスワードを入力しても。当然、これは、次のコードを使用してログインしようとしたときのパスワードとは比較になりません。

    require_once('connection.inc.php');
$conn = dbConnect('read');
// get the username's details from the database
$sql = 'SELECT salt, pwd FROM users WHERE username = ?';
// initialize and prepare  statement
$stmt = $conn->stmt_init();
$stmt->prepare($sql);
// bind the input parameter
$stmt->bind_param('s', $username);
// bind the result, using a new variable for the password
$stmt->bind_result($salt, $storedPwd);
$stmt->execute();
$stmt->fetch();
// encrypt the submitted password with the salt
// and compare with stored password
if (sha1($password . $salt) == $storedPwd) {
    $_SESSION['authenticated'] = 'Jethro Tull';
    // get the time the session started
    $_SESSION['start'] = time();
    session_regenerate_id();
    header("Location: $redirect");
    exit;
} else {
    // if no match, prepare error message
    echo "  pwd " . $password;
    echo "  salt " . $salt;
    echo "  sha1 " . sha1($password . $salt);
    echo "  St. pwd " . $storedPwd;
    $error = 'Invalid username or password';
}

なぜこれが起こっているのか誰にも分かりますか?

4

3 に答える 3

3

これがあなただけの問題かどうかはわかりませんが、

 $pwd = sha1($password, $salt);

関数の使用方法ではありませんsha1http://php.net/manual/en/function.sha1.php

time()常に評価されるためTRUE、生のバイナリ形式を char パスワードフィールドに挿入しています。あなたが見ている問題を引き起こしています。

あなたがおそらくやりたいことは

 $pwd = sha1($password . $salt);
                       ^
于 2012-10-17T19:32:15.847 に答える
0

sha1は、デフォルトでバイナリハッシュを返します。これはcharフィールドに格納されています。charフィールドは文字セット変換の対象となります。つまり、mysqlがハッシュをマングリングしています。代わりに、フィールドをバイナリ/ varbinaryに変換します。これは、文字セット変換の対象ではありません。

于 2012-10-17T19:34:20.023 に答える
0

データベースにデータを挿入するとき,に、ドット()の代わりにコンマ()を記述した単純なタイプミスがあります。.

// encrypt the password and salt
$pwd = sha1($password, $salt);

これを、パスワードを検証するときにハッシュサムを生成する場所と比較してください。

// encrypt the submitted password with the salt
// and compare with stored password
if (sha1($password . $salt) == $storedPwd) {

2つは非常に異なる意味を持っているので、小さな間違いは全体的に大きな結果をもたらします。

$passwordプラスで構成される新しい文字列を作成したかったの$saltですが、sha1代わりに1つではなく2つの引数を指定しています。

関数が返すデータの種類を制御する2番目の引数sha1、プレーンテキスト(falseの場合、デフォルト)と生データ(trueの場合)。

于 2012-10-17T19:35:37.957 に答える