首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP password_hash和password_verify不使用MySQL

PHP password_hash和password_verify不使用MySQL
EN

Stack Overflow用户
提问于 2015-02-23 03:43:14
回答 4查看 4.8K关注 0票数 1

我使用password_hash将密码存储在VARCHAR(255)类型的MySQL数据库字段中。当我尝试登录用户并验证凭据时,password_verify函数总是返回false。

下面是将密码存储在MySQL数据库中的代码摘录:

代码语言:javascript
运行
复制
$password_hash = password_hash($password, PASSWORD_DEFAULT);

// Generate API Key
$api_key = $this->generateApiKey();

// Insert Query
$stmt = $this->conn->prepare("INSERT INTO user(email, password, name, api_key, status) values(?, ?, ?, ?, 1)");
$stmt->bind_param("ssss", $email, $password_hash, $name, $api_key);
$result = $stmt->execute();
$stmt->close();

以及检查密码的代码:

代码语言:javascript
运行
复制
// Query user by email
$stmt = $this->conn->prepare("SELECT password FROM user WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();

$stmt->bind_result($password_hash);
$stmt->store_result();

if ($stmt->num_rows > 0) {
    // Found user with that email address
    // Now verify the password

    $stmt->fetch();
    $stmt->close();

    if (password_verify($password, $password_hash)) {
        // User password is correct
        return TRUE;

然后我编写了这个测试代码,直接从MySQL字段抓取数据,结果仍然失败。当我在同一个文件中创建password_hash (下面文件中的$hash2)时,密码将正确验证。

代码语言:javascript
运行
复制
$password = 'pass1234567890';
$hash = '$2y$10$JLP/pPei6RYRdUmoH8H5RO7iJyImOtrBLsrRRfq3XpeqNE3lQ/l7O';
$hash2 = password_hash($password, PASSWORD_DEFAULT);

echo $hash . " - " . strlen($hash);
echo "<br />";
echo $hash2 . " - " . strlen($hash2);
echo "<br />";

if (password_verify($password, $hash)) {
    echo "Password Valid!";
} else {
    echo "Password invalid!";
}

echo "<br /><br />";

if (password_verify($password, $hash2)) {
    echo "Password 2 Valid!";
} else {
    echo "Password 2 invalid!";
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-23 03:56:32

这证明了您的散列有问题。

代码语言:javascript
运行
复制
<?php
// See the password_hash() example to see where this came from.
$password = 'pass1234567890';
$hash = '$2y$10$JLP/pPei6RYRdUmoH8H5RO7iJyImOtrBLsrRRfq3XpeqNE3lQ/l7O';

$hash2 = '$2y$10$gMJKYZUc1FKSZBnsONxLOebOHj.uuEWSiCP0jo4Zv0iAHBz6iz.NG';

if (password_verify('pass1234567890', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

echo "<br>";

if (password_verify('pass1234567890', $hash2)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

屏幕截图

票数 1
EN

Stack Overflow用户

发布于 2022-01-24 08:52:12

在我的例子中,问题是我将数据库连接查询存储在另一个文件中,该文件包含了用于获取当前密码的相同变量,因此,首先我为当前密码分配了一个变量" password“,然后包含了具有相同变量" password”的连接查询文件,因此发生的情况是,注册表单的“密码”变量被连接查询的“密码”变量重新分配,这就是为什么它实际上使用了另一个密码。因此,通过更改变量名,这个问题得到了解决。

这是我的代码供参考,

signup.php

代码语言:javascript
运行
复制
    $email = $_POST["email"];
    $password = $_POST["password"];
    
    include 'partials/php/_dbconnect.php';
    $passwordHash = password_hash($passwd, PASSWORD_DEFAULT);

_dbconnect.php

代码语言:javascript
运行
复制
<?php
$server = "localhost";
$username = "root";
$password = "";
$database = "demo";

$connectionquery = mysqli_connect($server, $username, $password, $database);
?>

我改到了;

代码语言:javascript
运行
复制
    $email = $_POST["email"];
    $passwd = $_POST["password"];
    
    include 'partials/php/_dbconnect.php';
    $passwordHash = password_hash($passwd, PASSWORD_DEFAULT);
票数 0
EN

Stack Overflow用户

发布于 2022-02-11 00:07:57

代码语言:javascript
运行
复制
password_verify($password,trim($password_hash)))

虽然我不确定它是在存储哈希时还是在检索过程中发生的,但是password_hash在末尾有一个空格。在将哈希输入到password_verify之前对哈希进行修剪,为我解决了这个问题。

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

https://stackoverflow.com/questions/28666597

复制
相关文章

相似问题

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