Как использовать password_hash Зарегистрироваться и войти

Я пытаюсь понять, как использовать password_hash в системах регистрации и входа.

В настоящее время я использую password_hash для регистрации своих пользователей.

$pass = $_POST['Pass']; 
$hashed_password = password_hash($pass, PASSWORD_DEFAULT); 

$stmt = $conn->prepare("INSERT INTO `usuario`(`Nick`, `Nombre_u`, `Apellidos`, `e-mail`, `Password`, `Domicilio`, `Colonia`, `Codigo_Postal`, `Cuidad`, `Estado`, `Telefono`) VALUES (?, ?, ?, ?, ?, ? , ?, ?, ?, ?, ?)"); 
$stmt->bind_param( "sssssssisss", $nick, $nombre, $apellidos, $mail, $hashed_password, $domicilio, $colonia, $cp, $cuidad, $estado,  $telefono); 
$stmt->execute(); 
header("Location: ../Registrado.php?Done=Welcome"); 

И я регистрирую своих пользователей таким образом.

$usuario = $_POST["Nick"];
$contra = $_POST["Pass"]; 
$hashed_password = password_hash($contra, PASSWORD_DEFAULT);  
$stmt = $conn->prepare("SELECT Nick, Password FROM usuario WHERE Nick = ? AND Password= ?");
$stmt->bind_param( "ss", $usuario, $hashed_password); 
$stmt->execute();
$stmt->store_result(); 
$stmt->bind_result($a, $b); 
if($stmt->fetch() == 0){ 
    header("Location: ../Entrar.php?message=Error");
    exit();
} 
else {  
    session_start(); 
    $_SESSION['Usuario'] = $a; 
    $_SESSION['estado'] = 'Autenticado';  
    header("Location: ../../Index.php"); 
    exit();
}    

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

Сначала примет мой ввод, например: «123», затем hashed_password превратит мой ввод в, например: «$2y$10$BvFW3ott5f7JvZ4rCa», и мой запрос выполнит свою работу следующим образом.

SELECT Nick, Password FROM usuario WHERE Nick = 'User' AND Password= '$2y$10$BvFW3ott5f7JvZ4rCa'

Но я все еще возвращаюсь к своей форме входа вместо входа в систему.

Что я делаю не так?


person Mugen    schedule 05.03.2017    source источник
comment
для входа в SELECT требуется password_verify(), а не password_hash().   -  person Funk Forty Niner    schedule 05.03.2017
comment
кроме того, длина столбца вашего пароля слишком мала. Лучше вернуться к чтению руководств и следовать его синтаксису буквально.   -  person Funk Forty Niner    schedule 05.03.2017
comment
password_hash() будет создавать разные хеши каждый раз, когда вы его используете, даже для одного и того же пароля. Вам нужно получить хэш пароля для имени пользователя, а затем, как упоминалось в других комментариях, вместо этого проверить его с помощью password_verify() в своем коде.   -  person Magnus Eriksson    schedule 05.03.2017
comment
Ответил на тот же вопрос в этом ответе. Надеюсь, поможет.   -  person martinstoeckli    schedule 05.03.2017


Ответы (1)


Хорошо, я сделал эту работу с password_verify()

$usuario = $_POST["Nick"];
$contra = $_POST["Pass"];   
$stmt = $conn->prepare("SELECT Nick, Password FROM usuario WHERE Nick = ?");
$stmt->bind_param( "s", $usuario); 
$stmt->execute();
$stmt->store_result(); 
$stmt->bind_result($a, $b);   

if($stmt->fetch() == 0){ 
    header("Location: ../Entrar.php?message=Error");
    exit();
}
else {  
    if(password_verify($contra, $b)) {
        session_start(); 
        $_SESSION['Usuario'] = $a; 
        $_SESSION['estado'] = 'Autenticado';  
        header("Location: ../../Index.php"); 
        exit; 
    }
    else{ 
        header("Location: ../Entrar.php?message=Error");
        exit;
    }
} 

Спасибо за все эти комментарии. И да, martinstoeckli это был ответ на мой вопрос, спасибо

person Mugen    schedule 05.03.2017