Я подумал, что, возможно, моя система входа не так безопасна, как я думал.
Итак, сначала я собираюсь объяснить вам словами, что я делаю.
Когда пользователь регистрируется, генерируется соль из 16 символов.
Я храню соль в базе данных в поле под названием «соль»
Я храню хешированный пароль + соль (они хешируются вместе hash("sha256", $salt.$password);
) в поле с именем "пароль"
Когда пользователь пытается войти в систему, я выбираю поле «пароль» и «соль» из базы данных, а также некоторые другие вещи.
Чтобы проверить, правильно ли они ввели свой пароль, я делаю это:
$hashed = hash("sha256", $row['salt'].$pass);
if ($row['password'] == $hashed) {
//success
($ row - это извлеченный массив из базы данных. $ Row ['salt'] - это соль в базе данных, $ pass - это введенный ими пароль, а $ row ["password"] - это хэшированный pass + salt в базе данных)
Я думал, и мне кажется, что моя соль дает мало (или нет) преимуществ безопасности вообще. Мой вопрос ко всем вам заключается в следующем: МОЖЕТ ли мой метод обеспечить дополнительную безопасность (или это вообще все безопасно?)
Кроме того, у меня есть второй «вопрос». Я хочу убедиться, что этот скрипт «проверки входа в систему» не может быть подделан / обманут, чтобы получить доступ к чьей-либо учетной записи без пароля.
session_start();
require_once 'db_connect.php';
//If the session variable "id" isn't set (i.e. they aren't logged in)
if (!isset($_SESSION['id'])) {
//Check if they wanted to be "remembered" (so they have 2 cookies
if (isset($_COOKIE['rem_user']) && isset($_COOKIE['rem_pass']))
{
$query = "SELECT
id,
password,
auth,
email,
username
FROM users
WHERE
username='".$_COOKIE['rem_user']."'
AND active IS NULL"
$res = mysql_query( $query );
if (mysql_num_rows($res) == 1)
{
$row = mysql_fetch_array($res);
// If the "remember me" cookie containing their password
// is equal to the one in the database, log them back in.
if ($_COOKIE['rem_pass'] == $row['password'])
{
$_SESSION['id'] = $row['id'];
$_SESSION['username'] = $row['username'];
$_SESSION['auth'] = $row['auth'];
$_SESSION['email'] = $row['email'];
$logged_in = 1;
}
}
}
else
$logged_in = 0;
}
else
//Since the session variable "id" WAS set, they ARE logged in.
$logged_in = 1;
Я думаю, что единственный способ войти в систему - это ...
- Подделать переменную сеанса, которая, на мой взгляд, невозможна без доступа к серверу
- Поддать куки с зашифрованным паролем + солью, что, я считаю, почти невозможно без доступа к базе данных.
Обратная связь будет оценена. Я хочу убедиться, что моя система безопасна. :)
Спасибо!