【问题标题】:how to use correctly bcrypt php class如何正确使用 bcrypt php 类
【发布时间】:2018-09-03 17:04:12
【问题描述】:

我正在尝试使用 bcrypt 类,但在我想使用验证码时无法正常工作。它总是散列一个新密码,所以我无法登录。

 <?php
        $password = Bcrypt::hashPassword($_POST['mdp_user']);

        $pwdVerify = Bcrypt::checkPassword($_POST['mdp_user'], $password); 

        $sql = 'SELECT * FROM tgn_users WHERE login="' . $_POST[ 'login' ] . '" AND mdp_user="' . $password  . '"';

        echo $sql;

        $req = mysqli_query( $connexion, $sql )or die( mysqli_error( $connexion ) );

        if ( mysqli_num_rows( $req ) > 0 ) {
                $nom_user = $_SESSION['nom_user'];
                $prenom_user = $_SESSION['prenom_user'];
                $_SESSION[ 'islog' ] = "connect";
                //header( 'Location: ../../profile.php' );
        } else {
                $_SESSION[ 'login' ] = $_POST[ 'login' ];
                $_SESSION[ 'mdp_user' ] = $_POST[ 'mdp_user' ];
                $_SESSION[ 'message' ] = "Erreur de log et/ou de pwd";
                //header( "Location: " . $_SERVER[ 'HTTP_REFERER' ] );
        }
  ?>

这是官方文档。我是 bcrypt 的新手,我真的不明白如何找到解决方案。请帮忙!

 <?php
      require_once 'Bcrypt.php';

      // hash the password => returns hashed password
      Bcrypt::hashPassword($password);

      // check $password against the $hashedPassword => returns true/false
      Bcrypt::checkPassword($password, $hashedPassword);
?>

【问题讨论】:

  • PHP 已经自带了password_* API,查看docs
  • 您需要验证行,而不是哈希。
  • 如果您使用的版本早于 5.5.0(您不应该使用),您可以使用 Anthony 制作的this library

标签: php hash login passwords bcrypt


【解决方案1】:

只需使用password_hashpassword_verify 作为密码。它支持许多哈希算法,甚至 Bcrypt,并且更容易理解。 您可以为password_hashpassword_verify 选择算法和回合(以及更多,但除非您知道自己在做什么,否则不要使用它)发现使用的算法

【讨论】:

  • 注意: PHP 7.0 不推荐为 password_hash() 选择盐。 (不是我的反对票,顺便说一句。)
  • 我做到了,但是当我想比较密码在我的数据库中的存储和 $_POST['password'] 时,它永远不会相同。 hashPassword 每次都会给我一个新的。我真的不知道该怎么办。使用 md5 非常简单快捷。 Bcrypt ...另一个故事。
  • 您使用 password_hash 创建另一个密码哈希,并使用 password_verify 检查输入的密码是否与存储的哈希匹配。所以你使用password_verify($_POST['password'], $storedHash);
  • @Rabah - 差别真的不大。从您的查询中删除“密码”(只需搜索登录名)。如果得到结果,只需将密码与password_verify() 进行比较,即可查看凭据是否匹配。您基本上只是将密码检查从查询移到代码之后。
  • @Rabah - 为同一个密码获取不同的哈希值是故意的,这是因为加盐,并且是安全密码哈希值的必须
【解决方案2】:

谢谢@Magnus Eriksson,我做到了,而且效果很好。

 <?php
 function logUser() {

require( './connexion.php' );

$sql_user = 'SELECT * FROM tgn_users WHERE login="' . $_POST[ 'login' ] . '"';

$req = mysqli_query( $connexion, $sql_user )or die( mysqli_error( $connexion ) );

if ( mysqli_num_rows( $req ) > 0 ) {

    $row = mysqli_fetch_assoc( $req );

    if ( Bcrypt::checkPassword( $_POST[ 'mdp_user' ], $row[ 'mdp_user' ] ) ) {

        if($row['login']='admin'){

            header( 'Location: ../../admin/' );

        }else{

            $_SESSION[ 'nom_user' ] = $row[ 'nom_user' ];
            $_SESSION[ 'prenom_user' ] = $row[ 'prenom_user' ];
            $_SESSION[ 'id_user' ] = $row[ 'id_user' ];
            //$lifetime = 60*60*24*30;
            //setcookie(session_name($_SESSION['nom_user']), session_id($_SESSION['id_user']),time()+$lifetime,'/');
            header( 'Location: ../../profile.php' );
        }

    }else {
        $_SESSION[ 'message' ] = "Erreur de log et/ou de pwd";
        header( "Location: " . $_SERVER[ 'HTTP_REFERER' ] );

    }
}

  }?>

但是我的情况有问题。无论登录什么,我都会被重定向到管理页面:(。我在 if 条件中遗漏了什么吗?

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多