2015-06-17 2 views
3

Я пытаюсь отойти от использования md5() для хранения и сравнения паролей. Поэтому я хочу начать использовать password_hash().Является ли этот пользователь достаточно безопасным?

Теперь, как я это делал, было бы хранить имя пользователя и пароль md5 в их сеансе или файлы cookie (если они выбрали «запомнить меня»), а затем проверить базу данных, чтобы узнать, есть ли какой-либо пользователь существует с этим именем пользователя и паролем md5'd. Я понимаю, что это не очень безопасно, поэтому я хочу остановить это.

Я больше не могу этого делать, потому что password_hash() всегда изменяется, поэтому я не могу хранить хеш в их сеансе, а затем проверять его в базе данных, потому что мне нужно использовать password_verify по неуправляемому паролю.

Так что я задаю вопрос, храню ли хешированный «идентификатор сеанса» и «токен» в пользовательской таблице, когда пользователь успешно войдет в систему, а затем сохранит это в сеансе/cookie лиц вместе с идентификатором пользователя в порядке для проверки базы данных, достаточно ли этого? Когда я говорю хэшируюсь «идентификатор сеанса» и «маркер» Я имею в виду sha256'd или даже md5'd хэш случайных больших чисел ...

Пример:

Журналы пользователя в -> хешированы «идентификатор сессии» и «токен» хранится в файлах cookie пользователей, а их строка в базе данных обновляется хэшированным «идентификатором сеанса» и «токеном».

Посещаемость сайта -> код проверяет, существует ли в базе данных их «идентификатор сеанса» и «токен» на основе их браузера/файлов cookie. Если это так, предполагается, что найденная строка представляет текущего пользователя.

Любое понимание было бы весьма полезным.

+0

Вы можете использовать Хранение соленых паролей. –

+2

@PraveenD - password_hash() генерирует соленый хэш уже ... что вы на самом деле предлагаете? –

+0

Соль должна быть случайной с каждым хешем. –

ответ

0

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

$salts= ['cost' => 12]; password_hash("Password", PASSWORD_BCRYPT, $options);

$salts массив, который сочетает в себе miltiple раз, когда password_hash() используется.

PASSWORD_BCRYPT является algo, который хэширует строку с идентификатором $ 2y $ и с алгоритмом шифрования blowfish. Это выводит 60 символов смешанного набора.

+0

Вы можете добавить любое количество ключей ⇒ Значения в '$ salt' –

+1

Пожалуйста, не делайте' ['salt' => 12] ', вы хотите' ['cost' => 12] '. –

+0

Правильно @Scott Arciszewski, я понял позже. use '['cost' => 12]' –

1

Что бы я сделал, когда пользователь входит в систему, генерирует уникальный идентификатор для своего входа в систему, используя uinqid() (http://php.net/uniqid), а затем сохраните его в новой таблице. Затем Id проверяет эту таблицу, чтобы проверить, соответствует ли файл cookie uniqid, хранящемуся в таблице.

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

  1. SELECT * FROM 'UNIQIDS' WHERE $ current_date_and_time> 'EXPIRE' и удалить все результаты
  2. Проверить наличие куки.Если есть один и он соответствует uniqid, создать сеанс на компьютере, еще показать страницу входа

При входе пользователя в систему:

  1. Проверьте, есть ли уже uniqid хранится в таблице
  2. Если есть один сохраненный, если текущая дата и время истекают по истечении срока его действия, удалите строку
  3. Если истек срок действия, сгенерируйте новый с новой датой истечения срока действия, соответствующей дате истечения срока действия создаваемого вами файла cookie. Если он еще не истек, подсчитайте время между этим временем и временем его истечения и создайте файл cookie, содержащий его значение, и истечет в момент, когда вы рассчитали.

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

Для еще большей безопасности вы можете md5 uniqid, который вы создаете, но нет реальной необходимости, так как он не содержит важной информации.

Это довольно сложно, но если вы делаете это шаг за шагом, это не должно быть невозможным.

Удачи вам!

+0

Маркер должен быть хэширован перед сохранением в базе данных, в противном случае злоумышленник с доступом для чтения к db (SQL-injection) может прочитать токен и выдавать себя за пользователя. Поскольку токен (20+ случайных символов) является очень сильным «паролем», можно использовать быстрый несогласованный хеш, такой как SHA-256, который делает их сопоставимыми. – martinstoeckli

+0

Не обязательно. Если вы выберете все строки из таблицы, не предоставив конечному пользователю доступ к SQL-операторам, создав ассоциативный элемент и используя для цикла/loop, чтобы позволить php-поискам ассоциировать, вместо того чтобы позволить mysql искать таблицу перед возвратом ассоциированного объекта, она уходит таблица неуязвима для SQL Injection.После этого, если ваш SQL будет взломан, у вас больше проблем, чем безопасности хэшей. – zachal

+0

Это не обязательно запрос к таблице с токенами, которые могут выявлять хэши, каждый SQL-оператор должен быть защищен. Взгляните на пример в моем [учебнике] (http://www.martinstoeckli.ch/hash/en/hash_sqlinjection.php). Если вы используете стороннюю библиотеку, вам также придется протестировать этот код. И даже тогда есть другие способы, которыми могут быть потеряны токены, отброшенный сервер, резервная копия, ... – martinstoeckli

Смежные вопросы