【问题标题】:Using PHPass to hash password trouble使用 PHPPass 哈希密码问题
【发布时间】:2014-11-19 23:32:15
【问题描述】:

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

这里是代码

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

谢谢

【问题讨论】:

  • 不要使用 PHass,请使用原生 PHP 5.5 密码散列函数(也可用于带有 lib 的 PHP 5.3 / 5.4)
  • 您能否通过我的代码指导我了解 PHP 5.3 的源代码以及如何在我的登录代码中实现它
  • 为什么不使用 PHPass 不好,有 bug,很难还是什么?
  • @YousefAltaf - 您使用的 PHP 版本是 5.3.0 还是 5.3.7?我要检查的第一件事是函数check_input(),它是否可能改变输入(转义,修剪,...)?您不在注册表中使用它,因此这可能会有所不同。那你检查var_dump($stored_hash)的内容,对吗? PHPass 实际上是一个很好的库,尽管由于 PHP 有一个专用函数password_hash(),所以它有点过时了(可以从 PHP 5.3.7 开始使用)。您还可以在我的homepage 上找到更多信息。
  • @martinstoeckli 首先感谢您对我的帮助。我很高兴有人有兴趣回答我的问题,关于你关于 check_input() 的问题 不,我确定我在文件注册和登录区域都使用了它 我更新了 PHP 版本的问题,它是 5.3.29 见编辑我的问题

标签: php mysql hash phpass


【解决方案1】:

这些是我要检查的几点:

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) 的长度。也许您可以提供一个密码哈希(当然只是一个示例)?

【讨论】:

    【解决方案2】:

    此库需要 PHP >= 5.3.7 或具有向后移植 $2y 修复程序的版本(例如 RedHat 提供的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 2011-07-17
      • 2012-05-24
      • 2018-02-27
      • 1970-01-01
      • 2012-09-06
      • 2011-12-03
      • 1970-01-01
      相关资源
      最近更新 更多