Лучший способ хэширования маркера cookie "Запомнить меня" - PullRequest
6 голосов
/ 14 декабря 2011

Я пытаюсь реализовать функцию " запомнить меня ", следуя приведенным здесь рекомендациям: Полное руководство по аутентификации веб-сайтов на основе форм , а здесь: http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/

Похоже, что «токен cookie» должен хэшироваться при хранении в БД (если у злоумышленника есть доступ к БД, нехешированные токены выглядят как обычные логины / пароли, позволяющие войти на сайт).

В поисках хорошего алгоритма хеширования, я нашел эту рекомендованную технику, используя bcrypt : https://stackoverflow.com/a/6337021/488666

Я попробовал ее и обнаружил, что с количеством предложенных раундов(15) приводит к очень медленному времени обработки (хэш 2,3 с + проверка 2,3 с на Intel Core 2 Duo E8500 + 4 ГБ ОЗУ)

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

Как вы думаете, будет ли меньше раундов (например, 7, что сокращает время обработки до 10 мс + 10 мс)?

1 Ответ

14 голосов
/ 14 декабря 2011

Цитирование Полное руководство по проверке подлинности веб-сайта на основе форм :

НЕ ХРАНИТЕ ПЕРСИСТЕННУЮ ЛОКАЛЬНУЮ КУКИ (ТОКЕН) В ВАШЕЙ БАЗЕ ДАННЫХ, ТОЛЬКО ХЭШIT! Токен входа в систему - это Эквивалент пароля, поэтому, если злоумышленник попадет в вашу базу данных, он может использовать токены для входа в любую учетную запись, как если бы они были комбинациями логин-пароль в виде открытого текста. Поэтому при хранении постоянных токенов входа в систему используйте сильное хэширование (bcrypt / phpass) .

Я согласен с первым жирным шрифтом, но не с последним.

Если я не ошибаюсь, цель алгоритма "сильного соленого хеширования" состоит в том, чтобы кто-то не мог получить пароли по радужной таблице.

Но здесьхеш-строка - это не пароль, а случайная строка .Поэтому весьма маловероятно, что любая радужная таблица сможет извлечь любую первоначально хешированную строку.Я даже догадываюсь, что просто мог бы использовать для этого простой hash('sha256', $randomString) вызов, цель которого - получить разные значения для токена в БД и в cookie.

...