Пожалуй, приведённый в статье способ немного безопаснее. HTTPS легко подламывается через monkey in the middle с подменой сертификата. Браузер конечно выкидывает предупреждение о странном сертификате, но это не гарантия. Здесь такое не прокатит.
monkey in the middle это хорошо, да )))
но при mitm таким же образом можно подсунуть вместо шифрующего js тот, который просто сольёт пароль куда надо в открытом виде. и даже браузер не предупредит никого.
в данноё схеме всё сильно плохо:
1) пароль, введенный пользователем вообще не используется. авторизация производится по md5(пароль). проще говоря, имея дамп базы с сервера можно просто «в лоб» использовать скачанный оттуда хеш, не заморачиваясь разворачиванием
2) никак не рассматривается вопрос «расхождения» часов
3) никак не рассматривается вопрос разных часовых поясов
в общем и целом — +1 hidden поле для защиты от «спам ботов» и передача модифицированного пароля — по сути передача того же пароля.
Ну и толку-то? Если сервер не проверяет это значение — то достаточно один раз перехватить передающуюся пару unixtime + pass.
Если проверяет — см выше пункты 2 и 3.
Расхождения чего с чем должно проверяться?
— Сервер пишет в поле формы свой timestamp.
— На клиенте пользователь вводит пароль.
— От пароля находится контрольная сумма, таймстампом солится.
— Таймстамп и контрольная сумма передаются на сервер.
— Сервер солит свой пароль таймстампом.
— Если хэши совпадают, а таймстамп, который гарантированно верный, потому что посоленный, и который ни с чем расходиться не может, потому что с сервера получен, не протух на 5 минут, то перед нами пользователь.
А про часовые пояса и их влияние на таймстампы — это что-то новенькое.
Единственное, я бы немного усовершенствовал схему. Пусть на клиенте скрипт при загрузке страницы как можно раньше выдергивает тамстамп и начинает считать секунды. Потом, соответственно и солит и на сервер отправляет сумму. Тогда и время свежести таймстампа можно сократить секунд до 15, и пользователь может с открытой формой логина сколько угодно сидеть.
Зачем нужен таймстамп вообще? Чем он лучше рандомного?
Если сервер дал клиенту таймстамп — зачем его отдавать обратно? Пусть сервер помнит что он передал — иначе клиент вернёт любую фигню.
Да, можно синхронизовать время клиента и сервера и солить в момент отправки — но… в чем безопасность этой схемы?
> Зачем нужен таймстамп вообще?
Чтобы проверить, что пользователь залогинился сейчас, а не когда-то и теперь по перехваченным данным логинится злоумышленник.
> Чем он лучше рандомного?
Рандомный ключ придется где-то хранить, чтобы не позволить злоумышленнику использовать его повторно. Через год у вас будет миллионы использованных ключей.
> Если сервер дал клиенту таймстамп — зачем его отдавать обратно?
Потому что иначе его придется где-то хранить, например в сессии. А это означает:
— На каждого анонима придется стартовать сессию.
— Нельзя открыть вторую страницу сайта и залогиниться на первой.
> Пусть сервер помнит что он передал — иначе клиент вернёт любую фигню.
Любая фигня не пройдет проверку на тухлость.
На практике, я видел как люди не могли войти из-за сбоя таймзоны — сессия жила 15 минут, а сдвиг на час делал куку невалидной сразу после входа. Пользователь видел это так: вводит логин, вводит пароль, видит результат успешного логина. Но на любое дальнейшее движение опять форму логина.
кстати — почему а вторую страницу нельзя залогиниться на первой? рандомная фигня не обязана меняться на каждый рефреш.
Что-то я не совсем понимаю ваш алгоритм.
На сервере предполагается хранить в базе хэш от пароля с солью, где соль это время.
Также эту соль вы будете совать в hidden поле, как будете узнавать, кому какое время отдавать?
Да и +- 60 секунд брать это как? проверять на +-60 паролей?
Я не автор, но отвечу.
На сервере хранится несолёный пароль. Потом к нему приклеивается время и считается md5.
+-60 секунд только перебором +-60 паролей. По-моему не так жирно.
Главный минус, который я сейчас вижу, — несолёные пароли на сервере. Слишком легко ломается, если утащат базу.
Ниже VolCh вскользь уже упомянул, но я отдельно акцентирую ваше внимание на том, что вариантов md5(пароль) конечное множество, а вот «пароль» — бесконечное (достаточно большое, чтобы считать его бесконечным).
Т.е. беря md5(md5()) вы снижаете криптостойкость хеша. То, что вы к хешу добавляете вычисляемый, т.е. по сути известный, параметр в виде времени, не делает ваш хеш более стойким.
Помоему это меркнет перед тем, что хеши паролей в базе несоленые, и для успешной аутентификации достаточно знать только лишь md5($password), который столь услужливо лежит в БД :)
Автору рекомендую посмотреть в сторону Http-Digest Auth, раз уж хочется без SSL/TLS, лучше — SRP.
Согласен.
Все эти факты указывают, что автор, видимо, не до конца понимает всю схему и имеет слабое представление о шифровании и имеющихся на текущий момент средств защиты.
Не все понятно. Из полученно кеша нужно будет выдирать md5 пароля? Что делать людям с отключенным JS (есть и такие)? Если у пользователя очень медленный интернет, он вообще не сможет авторизоваться?
https, level 3 сертификат (заметнее разница при подмене), проактивная политика паролей (менять, заставлять ставить сложные), авторизация через одноразовые пароли-карты, через токены — работает
описанное — не работает
защиты от mitm нет, от кейлоггеров нет, от перехвата трафика — минимальная
Если я внедрился в канал, то я для начала перехвачу отправляемый хэш и таймстамп, отправлю их серверу сам, получу от сервера куку, поброжу по страницам с секретными данными, сделаю своё чёрное дело, а потом отправлю куку клиенту.
Если я канал могу только слушать, то запишу хэш и таймстамп, «побрутфорсю» по таблицам 16 цифр+таймстамп (вроде как задача получения пароля из md5 хэша пароля с солью при известной соли уже решаема с большой вероятностью), потом побрутфорсю пароль. Или по словарю-алгоритм мне известен, соль в виде таймстампа тоже, неизвестен только пароль
И кстати, зачем привязываться к времени? Просто при запросе формы логина сервер отправляет рандомную соль в хидден/куке, а клиент считает хэш с ней. Хуже чем с таймстампом точно не будет. Время уж точно не секрет. А всякие +- 60 секунд заботится не надо
Безопасная авторизация