【问题标题】:PHP - hashing passwords with bcryptPHP - 使用 bcrypt 散列密码
【发布时间】:2019-01-19 16:50:37
【问题描述】:

我对有效的哈希密码有疑问:

login.php

$login = $_POST['login'];
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
if(!empty($login) && !empty($password) && password_verify(??){

我想进行安全登录,并且我知道我必须使用现有哈希(存储在数据库中?)验证输入的密码。我也知道 bcrypt 每次都会产生新的哈希(因为不同的盐大小等)。

问题是我不知道如何将此哈希放入数据库,因为我不想注册新用户,我有静态用户列表(正好两个:管理员和用户)。

我尝试手动复制/粘贴哈希,但它不起作用,正如我之前提到的,每次运行脚本时都会创建新的哈希。

谁能帮助我如何将 bcrypt 哈希放入数据库(仅一次),这样我只能检查输入的密码是否与数据库中的密码相同?

我需要额外的变量来存储这个哈希吗?

编辑:

login.php

<?php
session_start();
include("log.php");
include("pdo.php");
$login = $_POST['login'];
$password = $_POST['password'];

$adminHash = '$2y$10$lxPRtzzPDUZuPlodhU4QquP.IBrGpkjMNplpNgN9S1fEKd64tJ5vm';
$userHash = '$2y$10$Klt345wT66vA.4OAN5PEUeFqvhPQJ4Ua/A4Ylpc1ZcnJZv/hafgSu';

if(!empty($login) && !empty($password) && (password_verify($password, $adminHash) || password_verify($password, $userHash))){
    $query = $pdo->prepare('SELECT * FROM xx WHERE login = ? AND admin = ?');
    $query->execute(array( $login, 1));
    $result = $query->fetchAll();
    if(!empty($result)) {
        $_SESSION['logged_admin'] = 1;
    }
    else {
        $query->execute(array( $login, 0));
        $result = $query->fetchAll();
        if(!empty($result)) {
            $_SESSION['logged_user'] = 1;
        }
        else {
            $_SESSION['logged_error'] = 1;
        }
    }
}
else $_SESSION['logged_error'] = 1;
header("Location:index.php");

?>

它似乎正在工作,但我不知道它是否是最好/最安全的解决方案。
有了更多密码,我想它会太复杂,仍在寻找最佳选择!
如果我需要更多用户怎么办?现在每个用户都有相同的哈希,我得到它很危险,如何让它安全?为每个用户生成哈希并制作数组或哈希?

【问题讨论】:

  • 只要将哈希值存储在你存储静态用户列表的任何地方,然后使用password_verify将提交的密码与哈希值进行比较
  • 我认为这篇文章描述了解决这个问题的最佳方法:stackoverflow.com/questions/4795385/…
  • @JimL 感谢您的回答,您的意思是将其存储在脚本中?当我谈到静态用户列表时,我说的是数据库。我应该在哪里存储这种信息?有什么想法吗?
  • @ChristopherHughes 所以如果我想拥有 10 个用户,我需要存储 10 个哈希值吗?我还需要和他们每个人一起进行密码验证吗?我知道对此有更好的答案。
  • @dmnmlk 如果数据库中有用户,则将哈希添加到同一个表中

标签: php bcrypt php-password-hash


【解决方案1】:

您首先从数据库中获取具有 password_hash() 的那个,然后将其与 password_verify($password, $storedpassword) 进行比较,如下所示:link

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 2019-07-17
    • 1970-01-01
    • 2016-12-11
    • 2021-01-09
    • 2013-04-24
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多