【问题标题】:bCrypt fetch password from database ( PDO, PHP )bCrypt 从数据库中获取密码(PDO,PHP)
【发布时间】:2013-05-24 00:33:32
【问题描述】:

我目前正在从 md5 切换到 bcrypt,我可以使用以下代码将 bcrypt 设置到数据库中。

    public function User_Registration($_iPassword, $_iEmail, $_iUsername) {

    $sth = $this->db->prepare("SELECT _iD FROM users WHERE _iUsername = :username OR _iEmail = :email");
    $sth->execute(array(':username' => $_iUsername, ':email'    => $_iEmail ));

    $row = $sth->fetch(PDO::FETCH_ASSOC);
    $_iD = $row['_iD'];

    if ($sth->rowCount() == 0) {        

        $salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);   // create a random salt 
        $hash = crypt($_iPassword, '$2a$12$' . $salt);  // hash incoming password - this works on PHP 5.3 and up

        $sth = $this->db->prepare("INSERT INTO users(_iPassword,_iEmail,_iUsername) VALUES ( :hash_pass, :email, :username)");
        $sth->bindValue(":hash_pass", $hash);
        $sth->bindValue(":email", $_iEmail);
        $sth->bindValue(":username", $_iUsername);
        $sth->execute();

        $sth = $this->db->prepare("SELECT _iD FROM users WHERE _iUsername = :username");
        $sth->execute(array(':username' => $_iUsername));

        $me = "me";
        $sth = $this->db->prepare("INSERT INTO friends (friend_one,friend_two,role) VALUES ( :uid, :uid1, :me )");
        $sth->bindValue(":uid",     $row['_iD']);
        $sth->bindValue(":uid1",    $row['_iD']);
        $sth->bindValue(":me",      $me);
        $sth->execute();
    } else {
        return false;
    }
}

但我无法从数据库中取回数据,我目前正在使用以下代码来获取用户登录信息:

    public function User_Login($_iUsername,$_iPassword) {
    $md5_password = crypt($_iPassword);

    $sth = $this->db->prepare("SELECT _iD FROM users WHERE _iUsername = :username AND _iPassword = :password AND _iStatus='1'");
    $sth->bindValue(":username", $_iUsername);
    $sth->bindValue(":password", $md5_password);
    $sth->execute();

    if ($sth->rowCount() == 1) {
        $row = $sth->fetch(PDO::FETCH_ASSOC);
        return $row['_iD'];
    } else {
        return false;
    }
}

什么是从 MySQL 取回哈希密码的正确方法。任何建议都非常感谢。

【问题讨论】:

    标签: php mysql pdo bcrypt


    【解决方案1】:
    public function User_Login($_iUsername, $_iPassword) {
        $sql = "SELECT _iD, _iPassword FROM users WHERE _iUsername = ? AND _iStatus=1";
        $sth = $this->db->prepare($sql);
        $sth->execute(array($_iUsername));
        $row = $sth->fetch();
        if ($row && crypt($_iPassword, $sth['_iPassword']) == $sth['_iPassword']) {
            return $row['_iD'];
        }
    }
    

    【讨论】:

    • 是的,完美而短暂……阅读和理解其工作原理的时间。
    • 我发现唯一棘手的部分是($row && ...,它是为了防止在 $row 为空的情况下发出通知。所以它首先检查 $row 。如果为 FALSE,则不会执行以下语句。其余的对我来说很明显,但如果您觉得不清楚,请随时询问其他任何陈述
    • 这是唯一我在技术上不理解的部分,但是在返回行之后添加带有return false的else语句不是更好吗?
    • 没用的。没有返回意味着空返回 - 所以与 FALSE 相同。
    【解决方案2】:

    为了将来的支持,我返回了带有以下代码的加密哈希。

        public function User_Login($_iUsername, $_iPassword) {
        $sth = $this->db->prepare("SELECT _iD FROM users WHERE _iUsername = :username AND _iStatus='1'");
        $sth->bindValue(":username", $_iUsername);
        $sth->execute();
    
        if ($sth->rowCount() == 1) {
            $row = $sth->fetch(PDO::FETCH_ASSOC);
            return $row['_iD'];
        } else {
            return false;
        }
    
        $sth = $query->fetch();
        if (crypt($_iPassword, $sth['_iPassword']) == $sth['_iPassword']) {
                header("location:index.php");  
            return $sth;
        }
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多