代码之家  ›  专栏  ›  技术社区  ›  Asperger

在登录时使用password_hash()保护密码?

php
  •  3
  • Asperger  · 技术社区  · 11 年前

    作为编程和php的新手,但我渴望学习,我很快发现有所谓的“最佳”和“坏”实践。糟糕的做法是使用MD5加密,例如我即将学习并实现的加密。然而,我最近刚刚了解到一个相对新的password_hash()函数,它可以自动执行许多加密过程(是的,我没有使用单词alot:D),例如添加盐。如果我错了,请纠正我。

    所以这里我有一个关于如何正确使用这个函数的问题。

    function login_check() {
    
        $connection = database();
    
        $name = $_POST['name'];
        $password = $_POST['password'];
        $password_hash = password_hash($password, PASSWORD_DEFAULT);
    
        $query = "SELECT id FROM users WHERE name = ? AND password = ?";
        $stmt = mysqli_prepare($connection, $query);
        mysqli_stmt_bind_param($stmt, 'ss', $name, $password);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_store_result($stmt);
        $counter = mysqli_stmt_num_rows($stmt);
    
        if($counter > 0 && password_verify($name, $password_hash)){
            $_SESSION['login'] = $name;
            header('location:../../index.php');
            exit;
        }
        else {
            header('location:../../failed.php');
            exit;
        }
    }
    
    if(isset($_POST['name']) && isset($_POST['password'])){
        login_check();
    }
    

    这就是我要走的路,老实说,我不确定这条路是否正确。可能需要您的反馈。这是否可以,或者是否需要考虑其他因素来实现这一目标?

    我读到不再需要创建自己的盐和其他哈希相关的东西。

    3 回复  |  直到 11 年前
        1
  •  2
  •   deceze    11 年前

    在注册时, password_hash 输入的密码并将哈希密码存储在数据库中。

    登录时:

    1. 通过用户名从数据库中获取哈希密码,例如:

      SELECT password FROM users WHERE name = ?
      
    2. 使用刚刚输入的密码验证哈希密码:

      if (password_verify($_POST['password'], $databaseResult['password'])) {
          // match
      }
      

    你知道 :

    • 密码散列 登录时的任何内容
    • SELECT ... WHERE password = ? 登录时,因为您需要存储的哈希的随机盐,以便再次生成相同的哈希,因此无法在数据库中按哈希搜索任何内容
        2
  •  0
  •   Saty    11 年前

    你需要通过 $password 在您的 password_verify() 函数而不是 $name .

    所以改变

    password_verify($name, $password_hash)
    

    password_verify($password , $password_hash)
    

    注: - 密码验证() 需要存储在数据库中的密码和密码。不是你的哈希密码。

    此外,您还需要在数据库中存储哈希密码。

    并将您的密码与哈希值进行比较

     mysqli_stmt_bind_param($stmt, 'ss', $name, $password_hash);
    
        3
  •  0
  •   Valdas    11 年前

    一般的想法是通过用户名(电子邮件)查询数据库,并使用散列密码检索用户详细信息。然后,你跑 password_verify() 输入密码和数据库中的OLD哈希。如果匹配,则返回true。

    我没有测试代码,但它应该为您提供如何正确使用这些函数的示例。

    <?php
    function login_check()
    {
        $connection = database();
    
        $name = $_POST['name'];
        $password = $_POST['password'];
    
        $query = "SELECT password FROM users WHERE name = ?";
        $stmt = mysqli_prepare($connection, $query);
        mysqli_stmt_bind_param($stmt, 'ss', $name);
        mysqli_stmt_execute($stmt);
        mysqli_stmt_store_result($stmt);
        $counter = mysqli_stmt_num_rows($stmt);
        $user = mysqli_stmt_fetch($stmt); // retrieve old user password
    
        if ($counter > 0 && password_verify($name, $user['password'])) {
            $_SESSION['login'] = $name;
            header('location:../../index.php');
            exit;
        } else {
            header('location:../../failed.php');
            exit;
        }
    }
    
    if (isset($_POST['name']) && isset($_POST['password'])){
        login_check();
    }
    
    推荐文章