php - 从 sha1 加盐密码验证用户登录

标签 php hash passwords sha1 salt

我有一个非常简单的登录/用户注册脚本,它使用 sha1 和 salt 存储密码。我的密码和用户创建工作正常,并且将所有内容都很好地存储在数据库中,但是当我尝试使用凭据登录时,它不起作用。搜索此主题时我似乎找不到任何内容。

这是我的添加用户表单:

session_start();
include("includes/resume.config.php");

// make sure form fields have a value and strip them
function check_input($data, $problem='')
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
if ($problem && strlen($data) == 0)
{
    die($problem);
}
    return $data;
}

// get form values, escape them and apply the check_input function
$name = $link->real_escape_string(check_input($_POST['name'], "Please enter a name!"));
$email = $link->real_escape_string(check_input($_POST['email'], "Please enter an email!"));
$password = $link->real_escape_string(check_input($_POST['password'], "Please enter a password!"));

// generate a random salt for converting passwords into MD5
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$saltedPW =  $password . $salt;
$hashedPW = sha1($saltedPW);

mysqli_connect($db_host, $db_user, $db_pass) OR DIE (mysqli_error());
// select the db
mysqli_select_db ($link, $db_name) OR DIE ("Unable to select db".mysqli_error($db_name));

 // our sql query
$sql = "INSERT INTO admins (name, email, password, salt) VALUES ('$name', '$email', '$hashedPW', '$salt');";

//save the updated information to the database          
mysqli_query($link, $sql) or die("Error in Query: " . mysqli_error($link));

if (!mysqli_error($link)) 
{
    header("Location: file_insert.php");
}   

这是我的登录脚本:这是行不通的

function check_input($data, $problem='')
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
if ($problem && strlen($data) == 0)
{
    die($problem);
}
    return $data;
}

if(isset($_POST['submitLogin'])) { //form submitted?

// get form values, escape them and apply the check_input function
$name = $link->real_escape_string(check_input($_POST['name'], "Please enter a name!"));
$password = $link->real_escape_string(check_input($_POST['password'], "Please enter a password!"));

$saltQuery = $link->query('SELECT salt FROM admins WHERE name = "'.$name.'"');

$salt = mysqli_fetch_assoc($saltQuery);
$saltedPW =  $password . $salt;
$hashedPW = sha1($saltedPW);

mysqli_connect($db_host, $db_user, $db_pass) OR DIE (mysqli_error());
// select the db
mysqli_select_db ($link, $db_name) OR DIE ("Unable to select db".mysqli_error($db_name));

$validate_user = $link->query('SELECT id, name, password FROM admins WHERE name = "'.$name.'" AND password = "'.$hashedPW.'"');

if ($validate_user->num_rows == 1) {
    $row = $validate_user->fetch_assoc();
    $_SESSION['id'] = $row['id'];
    $_SESSION['loggedin'] = TRUE;
    Header('Location: file_insert.php');
} else {
    print "<center><p style='margin-top: 200px; font-weight: bold;'>Invalid Login Information</p>";
    print "<a href='admin-login.php'>Click here</a> to return to the login page.</center>";
}
}

最佳答案

可能还有更多的事情要做,但肯定它不起作用的原因之一是因为 mysqli_fetch_assoc返回一个数组,您可以像使用字符串一样使用它。

当您调用 $password 时,PHP 会提示数组到字符串的转换。 $salt 因为此时 $salt 是一个数组。结果是您将单词 Array 附加到密码,这导致了不正确的散列。如果您在 php.ini 中关闭了 display_errors 和/或将 error_reporting 设置为隐藏通知,那么您将不会看到此消息。

如果你改变:

$saltedPW =  $password . $salt;

到:

$saltedPW =  $password . $salt['salt'];

那么它应该可以工作了。

此外,您应该在将 $salt 插入数据库之前对其进行转义,因为它可能包含 null、不可打印或单/双引号,因为它是随机生成的。

关于php - 从 sha1 加盐密码验证用户登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12574380/

相关文章:

security - 以纯文本形式在内存中短暂保存用户密码是否安全?

iphone - Md5加密是对称还是非对称?

php - 仅在生产中找不到类 laravel 8

javascript - 什么是 JS 正则表达式来匹配文本中的 sha256 单词哈希?

c++ - 在 C++ 中清除哈希表

c# - 密码生成器代码

Windows 8 Metro - 如何制作密码文本框?

php - 无法使用 codeigniter 在 AWS [Ubuntu] 上上传文件

php - 无法使用php将表单数据保存到sql表

php - 在 php 扩展中添加两个共享库。 WHO?