【发布时间】:2015-02-23 03:43:14
【问题描述】:
我正在使用password_hash 将密码存储在 VARCHAR(255) 类型的 MySQL 数据库字段中。当我尝试登录用户并验证凭据时,password_verify 函数总是返回 false。
这是将密码存储在 MySQL 数据库中的代码摘录:
$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();
还有检查密码的代码:
// 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 字段中获取数据,但仍然失败。当我在同一个文件(下面文件中的 $hash2 )中创建 password_hash 时 - 然后密码验证正确。
$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!";
}
【问题讨论】:
-
你确定这是正确的哈希吗?
-
我直接从数据库中获取了该字段,尽管我确实注意到每次刷新测试页面时 $hash2 变量都会发生变化,但我不能 100% 确定 crypt 的工作原理以完全理解原因。
-
检查你的 MySQL 字符编码;检查您的数据库编码,检查您的表编码并检查您的列编码和排序规则。 MySQL should be using UTF8mb4_ character sets and collations.
-
还有;注意;成本 = 10 太低了。您的服务器的成本价值应尽可能高;通常 14+
标签: php mysql password-hash