PHP Blowfish Crypt возвращает другой хэш

У меня проблема с кодом ниже. Он был извлечен отсюда и немного изменен, чтобы включать проверку и запуск, когда соответствующие формы были представлены и прошли проверку. Проблема с хешированием пароля.

Хешированный пароль не совпадает с паролем в базе данных, даже если сам пароль и соль идентичны. Я проверил переменную $ hashed_password относительно того, что записывается в базу данных. Они идеально сочетаются. На стороне входа соль совпадает, но когда используется тот же пароль, часть после соли отличается? Результаты выглядят так:

$ 2a $ 05 $ Bj79bEbmWG9GeMbBAIXID.zMtNecb3B5qWkiGZrSccWcefQG7IXUy $ 2a $ 05 $ Bj79bEbmWG9GeMbBAIXID.6qNLDcZ21XAKoSOIriqTxlAUjjygo

Возникла проблема с вашим именем пользователя или паролем.

Если я не пропустил что-то очевидное, единственное, что я могу себе представить, - это другой алгоритм, используемый для регистрации при регистрации, но я не уверен, как это подтвердить или исправить. Любая помощь с благодарностью.

<?php

$password = mysql_real_escape_string($_POST['password']);
$username = mysql_real_escape_string($_POST['username']);

//This string tells crypt to use blowfish for 5 rounds.
$Blowfish_Pre = '$2a$05$';
$Blowfish_End = '$';

// // PHP code you need to register a user
if($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['register'])) {
    global $valid;
    user_reg_validate($con, $_POST['username'], $_POST['email'], $_POST['password'], $_POST    ['password2']);
    if ($valid != false) {
        // Blowfish accepts these characters for salts.
        $Allowed_Chars =     'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
        $Chars_Len = 63;

        // 18 would be secure as well.
        $Salt_Length = 21;
        $mysql_date = date( 'Y-m-d' );

        $salt = "";
        for($i=0; $i<$Salt_Length; $i++) {
            $salt .= $Allowed_Chars[mt_rand(0,$Chars_Len)];
        }

        $bcrypt_salt = $Blowfish_Pre . $salt . $Blowfish_End;
        $hashed_password = crypt($password, $bcrypt_salt);

        $sql = "INSERT INTO login (username, salt, password) VALUES ('$username', '$salt', '$hashed_password')";
        mysqli_query($con, $sql) or die( mysql_error() );
    }
}

if($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['login'])) {
    global $valid;
    user_login_validate($con, $_POST['username'], $_POST['password']);
    if($valid != false) {
        // Now to verify a user’s password
        $sql = "SELECT salt, password FROM login WHERE username='$username'";
        $result = mysqli_query($con, $sql) or die( mysql_error() );
        $row = mysqli_fetch_assoc($result);
        $hashed_pass = crypt($password, $Blowfish_Pre . $row['salt'] . $Blowfish_End);
        echo $hashed_pass . "</br>";
        echo $row['password'] . "</br>";
        if ($hashed_pass == $row['password']) {
            echo 'Password verified!';
        } else {
            echo 'There was a problem with your user name or password.';
        }
    }
}
?>

1 ответ

Вы можете получить то же самое бесплатно, просто используйте функцию password_hash (). Эта функция генерирует криптографически безопасную соль и делает ее частью хеш-значения, поэтому нет необходимости в отдельном поле базы данных. Он также использует $2y подпись и добавляет разумное значение по умолчанию для параметра стоимости (5 очень низкий).

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

Также помните, что ваш код не защищен от SQL-инъекций. Как только вы сможете переключиться на подготовленные операторы, написание кода станет еще проще, чем построение запроса, как вы это сделали, и MYSQLI и PDO его поддерживают. Этот ответ может дать вам начало.

Другие вопросы по тегам