хеширование в любом случае убирает возможность оптимизации подбора пароля по времени ответа. такая тема возникает только при сравнении чего-то один в один. тут такая херня, что надо хранить идентификатор, его в куку и в базу, а к нему в другое поле и в другую куку приписать то, чего сравнивается. Иначе мускул выдаст через изменение времени выборки какая строка сравнивается. с идентификатором и другой строкой для сравнения такой фигни не будет. мускул будет несекурно выбирать по идентификатору, а потом пхп будет секурно сравнивать.
Немного по некропощу, просто сейчас как раз тестирую что навоял и у меня странные теоретические вопросы возникли - Я реализовал следующим образом - что когда юзер заходит генерируется хэш PHP: $random_hash = bin2hex(random_bytes(30)); И добавляется запись в таблицу - с полями Код (Text): id session_hash users_sessions_user_id users_sessions_timestamp соответственно когда - после того как залогинился - то создается сессия и в неё данные храняться И авторизация обычном режиме проходит в следующем порядке 1) проверяем если ли сессия 2) Проверяем есть ли кука (если есть, то создаем сессию, а хэш куки обновляем) (нужно ли это? Ведь по идеи злоумышленник уже получил доступ и у него просто новая кука появится) В принципе такой подход какжется что работает но есть теоритические проблемы.. 1) При каждом заходе (ну естественно есть старая кука удалена) создается новая запись в таблице. Я просто зажал f5 и почти тысяча записей☻ 2) Теоритически ведь может совпасть хэш для двух пользоватлей, и кто то окажется не в своих "тапках"☻ (ну да я понимаю что можно либо проверять на уникальность перед вставкой или просто записать user_id в куку и сверять с ним, что бы знать что хотя бы это тот кто хочет войти в не чужой дядя) Правильный ли в целом подход? Или нужно пользователью давать только одну запись (на все устройства и барузеры и тд.)
Вот и я так же думаю) Я точнее в сомнениях) Просто хочется самому разобраться как писать грамотно. Я вот что хотел больше спросить - безопасно ли для ПОЛЬЗОВАТЕЛЯ - сделать один ключ (хэш) Который он будет использоваться - для всех браузеров и устройств Т.е. сгенерился для юзера например - 63798%2C11ca6286982339249c220177993a70f5cc7f159 Мы его добавляем в любую куку когда он зашел с мобилы, другого браузеа и т.д. Или нужно делать для кажного "акта" авторизациия (когда стоит галочка remember me) - нужно генерировать новый хэш, сохранять его в базе, и потом в куке. Просто тогда прям таблица с хэшами растет на как на дрожжах☺
всмысле ? для каждого зареганного юзера существует полочка для хеша, когда время подходит и юзает какой - нибудь функционал сайта, где требуется одноразовый токен, полочка обновляется другим хеш кодом. Где дрожжи ? кроме как при регистрации юзеров база данных полнеет. И чо ?
Я вот по этой статье делаю https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-term-persistence Особенно по вот этому пункту Proactively Secure Long-Term User Authentication Не у меня росло на дрожжках - так как при каждом залогинивании пользователя у меня создавалась новая запись с новым хэшем. Я просто вот что не могу в голове у себя уложить - если хэш обновляется в таблице, то он и обновляется в куке? Т.е. один пользователь сидит с двух разных браузеров. Он в одном зашел зашел в такое место где требуется авторизация, у него обновился хэш - и получается у того же пользователя на другом браузере - в куках уже не валидный хэ и он как бы выходит? Или я где то кардинально не понимаю смысла работы алгоритма?
хеш не меняется, я же днем с 3 компов сидел --- Добавлено --- одноразовый токен для форм (CSRF) не относится к хешу аутентификации --- Добавлено --- https://php.ru/forum/threads/66872/#post-541394
Задача просто оставлять пользователя залогиненым на сайте☻ Т.е. я правильно понимаю - что мы случайно генерируем значения - его записываем в куку, его же записываем в базу (один и только один, на пользователя) т.е. можно по идеи даже не делать отдельную таблицу а просто записать в поле пользователя? И у пользователя будет одна и также кука на всех браузерах и устройствах. Ну и соответсвено если поменять его значения - то он как бы выйдет☻ И менять её не нужно? А - hash_equals() используется что бы защититься от атаки по времени? Т.е. если не учитывать возможность атаки по времени то можно просто хранить слово сгенерированное Код (Text): $random_hash = bin2hex(random_bytes(30)); И однаждые его сгенерировав никогда не менять?
блоать я такой сейчас бред пишу, таблицу отдельную надо, для каждого браузера, хеш обычно создаю с помощью password_hash --- Добавлено --- функция не только засаливает необходимые данные для хеша, но и учитывает и вписывает свой овертайм
если одно поле на юзера, то меня на одном только устройстве будет запоминать я отдельную таблицу завёл
Т.е. правильно понимаю - что на каждый раз когда кто-то входит на сайт (с галочкой remember me) нужно вставлять новую строку в таблицу? Вот я про то и говорю - тогда ооочень быстро становить ооочень много записей.
Возвращаясь к теме - хотел спросить - по общепринятым стандартам какие допускаются символы для имени пользователя ? Ну кроме Банальных Код (Text): /^([a-zA-Z0-9]|\s)+$/ Разумно ли разрешать пробел? (и я так понял только в середине ника, но не в начале и не в конце) И если есть хорошие ссылочки на REGEX с общепринятыми правилами на имя пользователя. И по какой странной причине на некоторых сайтах нельзя использовать все специальные символы в пароле? (я частенько такое встречаю, но не понимаю почему? Ведь какая разница если пароль все равно хэшируется и никак не выводится в чистом виде?)
нет, если имя пользователя будет юзаться типа как вот так @имя в тексте, и его надо будет вылавливать и раскрашивать. да - во всех остальных случаях --- Добавлено --- потому что гладиолус