Пароль "Соли" - я все правильно делаю? - PullRequest
2 голосов
/ 03 апреля 2012

Я подумал, что, возможно, моя система входа не так безопасна, как я думал. Итак, сначала я собираюсь объяснить вам словами, что я делаю.

Когда пользователь регистрируется, генерируется соль из 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; 

Я думаю, что единственный способ войти в систему - это ...

  1. Подделать переменную сеанса, которая, на мой взгляд, невозможна без доступа к серверу
  2. Поддать куки с зашифрованным паролем + солью, что, я считаю, почти невозможно без доступа к базе данных.

Обратная связь будет оценена. Я хочу убедиться, что моя система безопасна. :)

Спасибо!

Ответы [ 3 ]

6 голосов
/ 03 апреля 2012

Ладно, вот так ... не накатить собственную безопасность.Вот некоторые проблемы, описанные выше:

  1. Хешированный пароль сохраняется в виде файла cookie. ЭТО НЕ ОТЛИЧАЕТСЯ ОТ СОХРАНЕНИЯ / ПЕРЕДАЧИ ПАРОЛЯ ТЕКСТА , поскольку он проверен как есть без примененной хэш-функции.

  2. Файл cookie представляет собой вектор атаки SQL-инъекций.

  3. Использует SHx для хеширования.(Используйте bcrypt, scrypt, hmac и т. Д.)

А потом я перестал искать.# 1 показывает, что это следует оставить существующей проверенной / проверенной библиотеке.

1 голос
/ 03 апреля 2012

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

Второй вопрос.Не храните пароль в куки.Вы можете подделать их очень легко (даже в расширенных настройках Chrome).Или украсть их (например, уязвимость XSS).Храните их в сессии.

1 голос
/ 03 апреля 2012

Использовать hash_hmac

Я использую это так: hash_hmac ($ algo, $ password. $ Salt, $ siteKey);

Даже если злоумышленник попадет ввашей базе данных, они будут нуждаться в вашем ключе сайта, чтобы успешно перебрать силу, хотя я не буду комментировать столкновения.Выберите свой алгоритм / яд.: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...