首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >password_hash()和password_verify()的问题

password_hash()和password_verify()的问题
EN

Stack Overflow用户
提问于 2020-11-17 18:35:19
回答 1查看 79关注 0票数 0

我正在用MySQL和PHP做一个登录系统。然后,我想使用password_hash和password_verify函数来加密用户的密码。但是,在我比较散列密码和散列密码(password_verify func)时,它并不适用。

这是我的密码。

signup.php

代码语言:javascript
复制
$password_hashed = password_hash($data['password'], PASSWORD_DEFAULT, array("cost"=>15));

$statement = $connection->prepare("INSERT INTO users (username, email, password) VALUES (:username, :email, :password)");


if ($statement && empty($result1)) {
   $result = $statement->execute( [
    ':username' => $data['username'],
    ':email' => $data['email'],
    ':password' => $password_hashed,
]);

header('Location: register.php');
$_SESSION['messages'][] = 'Thank you for registration. Check your email then log in.';
exit();
}

login.php

代码语言:javascript
复制
if ($user['username'] === $username && $user['password'] === password_verify($user['password'], $password)) {
    header("Location: panel.php");
    $_SESSION['username'] = $user['username'];
    die();
} else {
    $_SESSION['messages'][] = 'Incorrect user or password!';
    header('Location: login.php');
}

Where $password: $password = $data['password'];

其中$user:

代码语言:javascript
复制
$statement = $connection->prepare('SELECT * FROM users WHERE username = :username');
$statement->execute([':username' => $username]);
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
$user = array_shift($result);

输出: Incorrect user or password!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-17 18:39:36

这将返回一个布尔值(true/false):

代码语言:javascript
复制
password_verify($user['password'], $password)

所以这将永远不会是 true

代码语言:javascript
复制
$user['password'] === password_verify($user['password'], $password)

一旦您根据提供的用户名从数据库中选择了用户,只需验证密码:

代码语言:javascript
复制
if (password_verify($user['password'], $password)) {

一些关于你的术语的笔记,因为这很重要.

我想要加密用户的密码

不,您不希望_en_crypt用户的密码。你想“打乱”它。这是一个重要的区别。加密的东西可以返回到原来的形式。杂乱无章的事情不能。这是密码安全的重要组成部分。

比较散列密码和散列密码

没有什么“脱节”的东西。password_verify的内部操作是对提供的密码进行散列,并将结果与已散列的存储密码进行比较。在任何情况下,您都不能将存储的散列密码转换回其原始形式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64881267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档