пароль / система входа в php - PullRequest
3 голосов
/ 07 апреля 2010

Для системы входа в систему php это будет подходящая схема того, как она будет работать:

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

  1. Проверяет, существует ли пользователь в базе данных,
  2. если да, то извлеките соль для этого пользователя
  3. хешируйте пароль и соль (это будет сделано на на стороне клиента или сервера? Я думаю клиентская сторона была бы лучше, но php на стороне сервера, так как бы вы сделали это?)
  4. проверить значение по сравнению со значением в база данных,
  5. если значения совпадают, то пользователь ввел правильный пароль и они вошли в систему.

Ответы [ 5 ]

6 голосов
/ 07 апреля 2010

Проверяет, существует ли пользователь в базе данных, если он действительно затем извлекает соль для этого пользователя, хэш-пароль и соль (это будет сделано на стороне клиента или сервера? Я думаю, что сторона клиента была бы лучше, но php - сторона сервера так как бы ты это сделал?)

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

Что касается вашего вопроса, очевидным моментом является то, что при передаче данных хешу требуется гораздо больше передачи данных. Вместо одного запроса и ответа требуется 3 запроса и ответа. Это также увеличивает требования от браузера к браузеру с включенным JavaScript. В зависимости от вашей аудитории многие пользователи могут отключить JavaScript (обычно через плагин NoScript).

Что касается безопасности, то при разрешении пользователю видеть соль не будет влиять защита от радужных таблиц, показывая им, как вы комбинируете соль и пароль.

Попытки грубой силы через веб-интерфейс не являются тем, что в любом случае является большой проблемой, так как, надеюсь, вы бы допустили только 5 (или около того) попыток входа в систему на имя пользователя в час. Знание алгоритма соли и хэширования совсем не помогает (оно только уменьшает нагрузку на сервер;)). Однако, если у них есть база данных и они знают, как объединить соль и хеш, становится намного проще проводить атаку грубой силой.

Хотя защита через неизвестность не является реальной защитой, она делает вашу систему намного сложнее взломать, поэтому я рекомендую вам не пытаться хешировать на стороне клиента.

5 голосов
/ 07 апреля 2010

Проверяет, существует ли пользователь в базе данных, если он это делает, затем извлекает соль для этого пользователя, хэш-пароль и соль

Нет. Это означает, что вы попали в базу данных дважды.

хешируйте пароль и соль (будет ли это сделано на стороне клиента или сервера? Я думаю, что на стороне клиента будет лучше

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

Если вы хэшируете пароль перед отправкой на сервер, то злоумышленник может обойти JS и отправить предварительно хешированный пароль, считанный из базы данных, в вашу систему.

  1. Пользователь отправляет имя пользователя и пароль
  2. Пароль хешируется со стандартной солью для системы
  3. ВЫБЕРИТЕ несколько, cols ОТ your_users ГДЕ имя пользователя =? и пароль =?
  4. Подсчитать количество строк, возвращаемых из базы данных.
4 голосов
/ 07 апреля 2010

Должно быть на стороне сервера

1 голос
/ 09 апреля 2010

Вы на правильном пути, но позвольте мне помочь вам улучшить вашу систему.

Создайте сильный случайный ключ и сохраните его в файле над корнем документа:

/home/username/key
/home/username/public_html/login.php

Файл должен содержать (псевдо) случайные двоичные данные с максимально возможной силой. 512 бит случайных данных должны быть в порядке.

Затем сгенерируйте уникальную соль для каждого пользователя в вашей системе. Эта соль не должна быть сильнее 16-битных случайных двоичных данных.

Наконец, хэши паролей должны выглядеть примерно так:

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

где алгоритм хеширования имеет большое значение. Не используйте MD5 или SHA-1. Используйте семейство SHA-2, обычно SHA-256 или SHA-512. Кроме того, Whirlpool - хороший выбор.

Если вы хотите еще больше улучшить свою систему, вы можете многократно хешировать снова и снова, например:

public static function hash($algorithm, $data, $iterations = 1, $rawOutput = false)
{
    if ($iterations < 1)
        throw new Exception('There must be at least one iteration.');

    while ($iterations--)
    {
        $data = hash($algorithm, $data, true);
    }

    return ($rawOutput ? (binary) $data : bin2hex($data));
}
0 голосов
/ 07 апреля 2010

Почему так много ходов?

  1. Проверить, существует ли пользователь в базе данных, с заданным соленым хешированным паролем
  2. если это так, то получить информацию о пользователе

это все

Если вы говорите о безопасной передаче пароля от клиента к серверу - это другая история, вы можете обратиться к описанию авторизации дайджеста HTTP для схемы. Короче говоря, это хеширование пароля на стороне клиента с использованием случайного одноразового токена, хранящегося на стороне сервера. ИЛИ SSL, конечно же

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