即使我输入了正确的凭据,错误也是错误的用户名或密码

时间:2015-03-16 02:53:27

标签: php mysql hash mysqli salt

我使用hash&创建了我自己的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');

?>

4 个答案:

答案 0 :(得分:1)

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

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

不等于

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

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

答案 1 :(得分:0)

在创建页面中使用hash(hash(密码).salt)但是登录页面使用hash(salt.password)。

在您的create_admin操作中,您可以使用哈希密码

您的代码是

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

这意味着在create_page中你的散列是散列(散列(密码),盐)

但是你的login.php

您的代码是

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

这意味着在登录时你的哈希是哈希(salt,hash(密码))

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

答案 2 :(得分:0)

是的,我已经弄明白了......谢谢!序列应基于create_acc.php

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

的login.php

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

答案 3 :(得分:0)

如果您使用内置密码函数password_hash(),这将更容易,更安全。因为salt包含在生成的哈希值中,所以您也可以不使用盐的单独数据库字段。

// 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- *算法太快,因此太容易被强制使用。