【问题标题】:The error is incorrect username or password even I've entered the correct credentials即使我输入了正确的凭据,错误也是用户名或密码不正确
【发布时间】:2015-05-18 02:28:29
【问题描述】:

我使用哈希和盐创建了我自己的 login.php 方式。当我输入新的管理员帐户时,密码似乎在我的 phpmyadmin 上工作正常,但是当我在登录中调用哈希和盐时,“用户不存在”似乎很好。即使我输入了正确的凭据,错误始终是“用户名和密码不正确”。我已经在我以前的登录系统中使用过这个脚本,但我不知道为什么它现在可以工作了。

这是我的 login.php

<?php
include_once('config.php');
session_start();
$username = $_POST['username'];
$password = $_POST['password'];

$username = mysqli_real_escape_string($mysqli,$username);

$query = $mysqli->query("SELECT password,salt FROM admin WHERE username='$username'");

$numrows = mysqli_num_rows($query);

if($username == "" && $password =="") {
    echo '<center>';
    echo '<h3>Please Fill in the blank form</h3>';
    echo '<button type="button" class="btn btn-primary" id="goback" >Log In Again</button>';
    echo '</center>';
} else if($numrows!=0) {
    $userData = mysqli_fetch_array($query, MYSQL_ASSOC);
    $hash = hash('sha256', $userData['salt'] . hash('sha256', $password));

    if($hash != $userData['password']) {
        echo '<center>';
        echo '<h3>Incorrent username or password</h3>';
        echo '<button type="button" class="btn btn-primary" id="goback" >Log In Again</button>';
        echo '</center>';
    } else {
        header('Location: firstpagesurvey.html');
    }
} else {
    die('
        <center>
        <h3>Username does\'t exists</h3>
        <button type="button" class="btn btn-primary" id="goback" >Log In Again</button>
        </center>
    ');
}
?>

这里是 create_admin 操作

<?php
include_once('config.php');
session_start();

$username = $_POST['username'];
$password = $_POST['password'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];

$hash = hash('sha256', $password);

function createSalt(){
    $text = md5(uniqid(rand(), true));
    return substr($text,0,3);
}

$salt = createSalt();

$password = hash('sha256', $hash.$salt);

$username = $mysqli->real_escape_string($username);

$query = $mysqli->query("INSERT INTO `admin`(`username`,`password`,`firstname`,`lastname`,`salt`) VALUES('$username','$password','$firstname','$lastname','$salt')");

$mysqli->close();

header('Location: success.php');

?>

【问题讨论】:

  • 保存用户名和密码的代码在哪里?
  • 您为什么不检查对mysqli 的调用的响应是否有错误?
  • Norberh 你是什么意思?我有 login.html。
  • 流浪汉如何查看回复?
  • 您在注册用户时是否使用哈希和盐,以便使用哈希和盐将密码保存在数据库中?

标签: php mysql hash mysqli salt


【解决方案1】:

我认为问题出在您创建密码时。

$hash = hash('sha256', $password);

不等于

$hash = hash('sha256', $userData['salt'] . hash('sha256', $password));

因此;您需要修改加密密码的方式或修改您的身份验证方式

【讨论】:

  • 那你是什么意思。所以我必须修改我的 $hash = hash('sha256', $password);什么样的脚本?
  • 存储密码时需要将$password = hash('sha256', $hash.$salt); 改为$password = hash('sha256', $salt . hash('sha256', $password)); File: create_admin Line: 19
  • 您需要在创建密码和检查密码时匹配您的算法。很简单。
【解决方案2】:

在创建页面时生成哈希(hash(密码).salt),但登录页面生成哈希(salt.password)。

在您的 create_admin 操作中,您制作散列密码

你的代码是

$password = hash('sha256', $hash.$salt); 
/*and*/
$hash is $hash = hash('sha256', $password);

这意味着在 create_page 你的散列是 hash(hash(password), salt)

但是你的 login.php

你的代码是

$hash = hash('sha256', $userData['salt'] . hash('sha256', $password));

这意味着在登录时你的散列是 hash(salt, hash(password))

简而言之,您在 create_admin 和 login 之间的哈希顺序是错误的。

【讨论】:

  • 什么意思?所以我的 $hash 将是 $hash = hash(hash($password).salt)?
  • 啊,是的。因此,为了使其正常运行,我必须将我的登录哈希更改为此 $hash = hash('sha256', $password , $userData['salt']);我说的对吗?
【解决方案3】:

如果您使用内置密码功能password_hash(),它会更容易,更安全。因为盐包含在生成的散列值中,所以您也可以不使用盐的单独数据库字段。

// 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);

这不仅会创建加密安全的盐,还会使用具有成本因子 (BCrypt) 的哈希函数。密码破解工具通常开箱即用地提供双重哈希。 SHA-* 算法太快,因此很容易被暴力破解。

【讨论】:

  • 啊,好吧。顺便问一下,如何创建一个未登录用户无法查看的安全页面?例如我的“admin_page.php”信息信息存放的地方。如何创建一个 PHP 代码,如果未登录用户查看禁止页面时会发出警报?
  • @truelogicINC - 通常每个页面都必须测试用户是否登录,例如检查会话$loggedIn = isset($_SESSION['user']) 中的用户名。如果用户尚未登录,则重定向到登录页面header('Location: '.'login.php', true, 303); exit;
  • 谢谢先生。是的,我必须尝试您的代码和建议。 :D 非常感谢先生。 :D 先生,学习 Laravel 很难吗?前段时间我接受了一次采访,他们计划从代码点火器转到 laravel。我回答说:“我对 laravel 不太熟悉。”但我会努力研究我。为你先生。学习 laravel 难吗?
  • @truelogicINC - 我自己并不容易切换到框架,但 Laravel 是我最终确定的框架。也许最困难的部分是建立一个新项目,但之后很高兴使用该框架,该框架非常易读,因此易于理解。我买了一份Code bright 来开始我的工作,和Laravel docu 一起我可以解决我以后遇到的所有问题。当然,每个框架都需要一些时间来学习,但是如果您已经了解另一个框架,那应该不会太难。
【解决方案4】:

是的,我已经想通了...谢谢!顺序应该基于create_acc.php

$password = hash('sha256', $salt.$hash);

登录.php

$hash = hash('sha256', $userData['salt'] . hash('sha256', $password));

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 2018-11-20
    • 2020-07-21
    • 2013-02-05
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多