gpt4 book ai didi

php - 使用 PHPass 散列密码问题

转载 作者:行者123 更新时间:2023-11-30 22:56:45 27 4
gpt4 key购买 nike

我正在使用 PHPASS 来存储加密的密码并在登录时进行比较。

这是代码

ob_start();
$userName = $password = "";
$userNameErr = $passwordErr = $loginErr = "";
$hasher = new PasswordHash(8, false);

if (isset($_POST['subEmployee'])) {
if (empty($_POST['user_name'])) {
$userNameErr = "User name is required";

} else {
$userName = check_input($_POST['user_name']);
if (!preg_match("/^[0-9_a-zA-Z]*$/", $userName)) {
$userNameErr = "Only letters, numbers and '_' allowed";
}
}
if (empty($_POST['password'])) {
$passwordErr = "Password is required";
}else{
$password = check_input($_POST['password']);
}

$active = 1;
$loginUser = $db->prepare("SELECT password FROM users WHERE user_name=? AND activity=?");
$loginUser->bind_param('si', $userName, $active);
if ($loginUser->execute()) {
$results = $loginUser->get_result();
if ($results->num_rows == 1) {
$row = $results->fetch_object();
$stored_hash = "*";
$stored_hash = $row->password;
$check = $hasher->CheckPassword($password, $stored_hash);
if ($check) {
$_SESSION['name'] = $row->first_name;
$_SESSION['userId'] = $row->id;
$_SESSION['user'] = 1;
print_r($_SESSION);
header("Location:?pid=4");
} elseif (!empty($_POST['user_name']) && !empty($_POST['password'])) {
$loginErr = "'Invalid Login Information'";
}
}
}
}

到目前为止,它总是给出相同的消息“无效的登录信息”,我已经制作了存储密码的注册表单。

$hasher = new PasswordHash(8, false);
$hash = md5(rand(0, 1000));

if (empty($_POST['password'])) {
$error ['passwordErr'] = "Password is required";
} elseif (strlen($_POST['password']) < 8) {
$error ['passwordErr'] = "<span class='notAllowed'>Chose password with at last eight characters</span>";
} elseif (strlen($_POST['password']) > 72) {
$error ['passwordErr'] = "<span class='notAllowed'>Password max 72 characters</span>";
} elseif ($_POST['password'] !== $_POST['confirm']) {
$error ['passwordErr'] = "Password don't matching";
} else {
$password = $hasher->HashPassword($password);
}

当我检查我的数据库时,密码对我来说似乎是散列的,用户名在那里,一切都很好

但仍然收到“无效登录信息”消息。

这两行对不对

$loginUser = $db->prepare("SELECT password FROM users WHERE user_name=? AND activity=?");
$loginUser->bind_param('si', $userName, $active);

登录码是否正常

我也试试这个

更新我更新了我的代码

if (isset($_POST['subEmployee'])) {
$error=array();

$hash_cost_log2 = 8;
$hash_portable = FALSE;
$hasher = new PasswordHash($hash_cost_log2, $hash_portable);

if (empty($_POST['user_name'])) {
$userNameErr = "User name is required";

} else {
$userName = check_input($_POST['user_name']);
if (!preg_match("/^[0-9_a-zA-Z]*$/", $userName)) {
$userNameErr = "Only letters, numbers and '_' allowed";
}
}
if (empty($_POST['password'])) {
$passwordErr = "Password is required";
} else {
$password = $_POST['password'];
}
$active = 1;

$loginUser = $db->prepare("SELECT password FROM hired_person_info WHERE user_name=? AND activity=?");
$loginUser->bind_param('si', $userName, $active);
if ($loginUser->execute()) {
$results = $loginUser->get_result();
if ($results->num_rows == 1) {
$row = $results->fetch_object();
$stored_hash = "*";
$stored_hash = $row->password;
$check = $hasher->CheckPassword($password, $stored_hash);
if ($check) {
$_SESSION['name'] = $row->first_name;
$_SESSION['userId'] = $row->id;
$_SESSION['user'] = 1;
print_r($_SESSION);
header("Location:?pid=4");
} elseif (!empty($_POST['user_name']) && !empty($_POST['password'])) {
$loginErr = "'Invalid Login Information'";
}
} else {
$loginErr = "'We didn't find any users'";
}
}
}

从 PHPass 的手册中添加这个

$hash_cost_log2 = 8;
$hash_portable = FALSE;
$hasher = new PasswordHash($hash_cost_log2, $hash_portable);

仍然没有运气,有人可以告诉我哪里错了

编辑这是我的 check_input() 代码

function check_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}

我正在使用 PHP 5.3.29

谢谢

最佳答案

这些是我要检查的几点:

1) 在您的注册处理程序中,您直接检查 POST 变量,但是对于散列,您采用变量 $password,我将始终以相同的方式访问输入,例如:

$password = $hasher->HashPassword($_POST['password']);

2) 不建议将函数 check_input() 用于密码,因为您计算的是一个散列值,而这个散列值无论如何都是“安全的”。即使对于其他用户输入,也应该像您所做的那样对其进行验证,但转义应该尽可能晚地进行,并且只针对特定的输出。因此函数 htmlspecialchars() 不应为用户输入调用,而应始终在输出为 HTML 之前调用。

3) 在您的登录处理程序中,您使用 POST 变量访问一次密码,一次使用变量 $password。变量 $password 仅在 if 语句中设置,因此如果输入为空,则会填充错误,但会继续使用未初始化的 $password 变量。要么在开头填充变量,要么始终使用 POST 变量。

4) 由于您使用的是 PHP 5.3.29,因此您可以将新函数 password_hash()compatibility pack 一起使用.我不认为 PHPass 库是这里的问题,不过这里是新函数的示例。

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

5) 另一个经常犯的错误是,存储哈希值的数据库字段太短,需要长度为 varchar(60)。也许您可以提供您的密码哈希之一(当然只是一个例子)?

关于php - 使用 PHPass 散列密码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26034417/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com