Нужна помощь в создании страницы входа с солями - PullRequest
1 голос
/ 13 января 2011

Хорошо, я пытаюсь сделать страницу входа. Кажется, что все страницы работали довольно хорошо, пока я не добавил соли. Я не совсем понимаю их, но делать что-то такое базовое, как я, не должно быть сложно. Вот "loginusr.php":

<html>
<body>
<?php  

//form action = index.php

session_start();

include("mainmenu.php");  

$usrname  = mysql_real_escape_string($_POST['usrname']);    
$pass     = $_POST['password'];  
$salt     = $pass;
$password = sha1($salt.$pass);

$con = mysql_connect("localhost", "root", "g00dfor@boy");
if(!$con)
{
    die("Unable to establish connection with host. We apologize for any inconvienience.");
}

mysql_select_db("users", $con) or die("Can't connect to database.");

$select = "SELECT * FROM data WHERE usrname='$usrname' and password='$password'";
$query  = mysql_query($select);
$verify = mysql_num_rows($query);

if($verify==1)
{
    $_SESSION["valid_user"] = $usrname;
    header("location:index.php");
}    
else
{
    echo "Wrong username or password. Please check that CAPS LOCK is off.";
    echo "<br/>";
    echo "<a href=\"index.php\">Back to login</a>";
} 

mysql_close($con);    
?> 
</body>
</html>

Я использовал команду echo $password;, чтобы показать мне, совпадает ли пароль в базе данных со сценарием. Они сделали. Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 13 января 2011

Похоже, вы неправильно поняли соли, поскольку вы устанавливаете $salt в качестве пароля.

Соль должна быть полностью случайной строкой, которая хранится в записи пользователя вместе с хэшем пароля. Новая уникальная соль должна генерироваться для каждого пользователя. Поэтому вам нужно добавить в вашу базу данных новый столбец с именем «password_salt» или аналогичным.

Вместо того, чтобы пытаться использовать пароль в запросе SELECT и посмотреть, есть ли у вас какие-либо записи, вам на самом деле нужно просто SELECT, используя username / user_id, чтобы получить хеш и соль пароля, чтобы вы могли затем используйте их, чтобы определить, правильно ли пользователь ввел пароль.

Когда вы регистрируете новых пользователей, вы должны добавить поля с такими значениями, как

<?php
// This is registeruser.php

$salt = substr(sha1(uniqid(rand(), true)), 0, 20);
$pass = $_POST['password'];
$pass_to_store = hash("sha256", $salt.$pass);

// Then issue a DB query to store the $salt and $pass_to_store in the user record.
// Do not store $pass, you don't need it.
// e.g. INSERT INTO users ('username', 'password_salt', 'password_hash') VALUES (:username, :salt, :pass_to_store);
?>

Затем для проверки пароля остается тем же при входе в систему, вы делаете что-то вроде этого,

<?php
// This is loginuser.php

$user = // result from SQL query to retrieve user record
// e.g. SELECT password_hash, password_salt FROM users WHERE username='from_user'

$salt_from_db = $user['password_salt'];
$pass_from_db = $user['password_hash'];
if ($pass_from_db == hash("sha256", $salt_from_db.$_POST['password'])
{
    // Password matches!
}
?>

Не забудьте очистить вводимые пользователем данные и все, что вы помещаете в свою базу данных. Возможно, вы захотите использовать подготовленные операторы вместо того, чтобы постоянно помнить о mysql_real_escape_string.

0 голосов
/ 13 января 2011

Соль - это случайное значение, которое не дает злоумышленнику просто посмотреть источник хеша в таблице, созданной на основе общих паролей.(Использование имени пользователя в качестве соли, очевидно, не очень хорошая идея, так как оно добавляет очень мало энтропии).

Таким образом, вам необходимо сохранить соль в базе данных и прочитать ее из базы данных, чтобы вычислить соленый парольхеш для сравнения с сохраненным значением.

Вы неправильно написали имя пользователя пару раз, оно тоже неправильно в базе данных?

0 голосов
/ 13 января 2011

Похоже, вы солите с тем же паролем?Обычно соль - это случайный ключ, специфичный для вашего сайта, который вы добавляете к вводу пароля, что, похоже, у вас хорошо получается.Просто убедитесь, что вы используете ту же соль для проверки того, что вы используете при создании пароля.

Кроме того, для правильного использования сессий необходимо иметь session_start, прежде чем что-либо выводится на страницу:

<?php

session_start();

?>
<html>
<body>
...
...