密码验证在德鲁的手册中不起作用(密码哈希)[重复]

Posted

技术标签:

【中文标题】密码验证在德鲁的手册中不起作用(密码哈希)[重复]【英文标题】:password_verify doesn't work (password_hash) with Drew's manual [duplicate] 【发布时间】:2016-10-20 10:59:46 【问题描述】:

我创建了一个登录页面,但是当代码想用输入的密码验证散列密码时,它向我显示了错误消息。

<?php 
session_start();
$pdo = new PDO(xxxx);
if(isset($_GET['login'])) 
	$username = $_POST['username'];
	$password = $_POST['password'];
	
	$statement = $pdo->prepare('SELECT * FROM users WHERE username = :username');
	$result = $statement->execute(array('username' => $username));
	$user = $statement->fetch();
	//verify password
	if ($user !== false && password_verify($password, $user['passwort'])) 
		$_SESSION['userid'] = $user['id'];
		die('Login succesfull');
	 else 
		$errorMessage = "Login error";
	
	


if(isset($errorMessage)) 
	echo $errorMessage;

?>

现在我在Drew's manual 的帮助下编辑了代码,但它也不起作用。

<?php 
session_start();
$pdo = new PDO(xxxxx);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if(isset($_GET['login'])) 
	$username = $_POST['username'];
	$passwort = $_POST['password'];
	
$query = $pdo->prepare("SELECT * FROM users WHERE username=:username");
        $query->bindParam(':username', $username);
        $query->execute();

        unset($_SESSION['username']);

        if(($row = $query->fetch()) && (password_verify($passwort,$row['passwort'])))
            $_SESSION['username'] = $row['username'];
            //header("Location: ../../myaccount/myaccount.php");
            echo "hurray, you authenticated.<br/>";
        
        else 
            //header("Location:../../login/login.php ");
            echo "invalid login<br/>";
        

?>

【问题讨论】:

确保您有$password$user['passwort'] 的预期值,同时检查您没有对注册码中的密码进行任何字符串操作(即转义)。跨度> 密码栏真的叫passwort吗? (带 t) 是的,因为我是德国人。在我的表头中写着“密码”。 什么失败了$userpassword_verify($password, $user['passwort']) 我有它here 一口气,很容易重新创建。请注意伪造的注册块以阻塞数据库中的哈希以进行测试。 PDO。 【参考方案1】:

如果您在用户注册后对密码进行哈希处理并保存在数据库中,那么您还应该撤消该哈希以验证用户登录。在撤消哈希后,您将 $password = $_POST['password'] 与数据库中的等效项进行比较。

【讨论】:

你不能undohash。这就是你散列密码的原因。 但是当我回显 $password 时,它会显示输入的密码。当我回显 $user['passwort'] 时,它会显示哈希密码。 只需接受我在您的问题顶部抛出的重复目标并执行此操作。并阅读手册。这不是火箭科学。 如果您对从数据库中检索到的内容进行哈希处理,您应该得到用户在注册期间使用的原始密码字符串。 @TigpezegheRodrige 哈希是一种单向函数。您不会得到原始密码。你验证。阅读有关它的手册。永远不会找回原始密码。

以上是关于密码验证在德鲁的手册中不起作用(密码哈希)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

自定义密码匹配验证器在 angular5 中不起作用

使用用户/密码的 Git https 推送在 STS4 中不起作用 [重复]

[将Bcrypt与phpto哈希密码结合使用不起作用

自动完成=关闭在 chrome 中不起作用

Ajax成功功能在jquery mobile中不起作用

身份验证在 yii2 中不起作用