LINUX.ORG.RU

2019 год и опять аутентификация...

 


3

2

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

Сейчас наиболее популярно делать так: работаем только по https, при аутентификации передаем в явном виде пароль пользователя и логин (привет, man-in-the-middle!), сервер вычисляет хэш пароля, сравнивает его с хэшем из БД согласно данному логину, и высылает токен аутентификации. Далее пользователь этот токен в куках или local storage сохраняет и при авторизации каждый раз высылает его серверу. Просрочил токен - проходи аутентификацию заново.

Основных недостатка здесь два: во-первых, хоть это и сложно, но возможно на прокси-https сделать man-in-the-middle; во-вторых, требуется SSL (т.е. генерь самоподписной сертификат или покупай «кошерный»).

Может быть, есть какой-нибудь нормальный человеческий способ аутентификации, надежный как для HTTPS, так и для незащищенного соединения?

Скажем, самый простой способ: при аутентификации у сервера запрашивается случайно сгенеренный ключ. Он используется как соль: к хэшу (я надеюсь, жабоскрипт умеет sha512?) пароля добавляется эта соль и вычисляется новый хэш. Данный хэш с логином пользователя отправляются серваку. Тот делает аналогичные вычисления и сравнивает с данными из БД. Т.е фактически аутентификация заключается в запросе ключа. Через какое-то время ключ «прокисает» и надо пройти заново процедуру. Авторизация заключается в регулярной отправке серверу пары логин-хэш. В данном случае можно вообще в local storage браузера хранить хэш пароля пользователя и вообще никогда больше не требовать ввода логина/пароля (покуда пользователь не нажмет logout, в результате чего хэш пароля из local storage будет удален).

Какие косяки могут быть в этом способе?

покупай «кошерный»

Let's encrypt

при аутентификации у сервера запрашивается случайно сгенеренный ключ

Как же mitm?

хранить хэш пароля пользователя и вообще никогда больше не требовать ввода логина/пароля

Чем это отличается от бессрочного токена?

ddidwyll ★★ ()
Ответ на: комментарий от ddidwyll

при аутентификации у сервера запрашивается случайно сгенеренный ключ

Как же mitm?

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

Чем это отличается от бессрочного токена?

Я вообще нуль в авторизации/аутентификации! Что за бессрочный токен?

P.S. Все читаю https://webauthn.guide/ API вроде как есть, но вот что делать на сервере... У меня там будет крутиться демон на С, и нужно как-то в нем эту storedCredential.publicKey.verify реализовать...

OnlyAsk ()

а по поводу аутентификации в вебе так ничего путного и не придумали?

Аутентификацию чего не придумали? Сообщений? Сторон?

Не придумали как научить веб-макак понимать что-то сложнее чем логин/пароль, ето правда.

vasily_pupkin ★★★★★ ()
Ответ на: комментарий от vasily_pupkin

Мне нужно тупо проверить, что подключающийся к вебсокету (или отправляющий данные демону через POST-запрос) пользователь — валиден.

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

OnlyAsk ()
Ответ на: комментарий от OnlyAsk

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

OnlyAsk ()

Где бы нарыть MWE, чтобы сразу проверить? Т.е. минимальный сишный код, который откроет сокет на порту X, и минимальный код веб-страницы с аутентификацией пользователя.

Набрел на пару ссылок на некие библиотечки, выполняющие со стороны сервера нужный мне функционал, но они на крестах (а то и вообще жабе). Это не годится совершенно.

OnlyAsk ()
Ответ на: комментарий от OnlyAsk

Т.е. тебе нужно и то и другое, а TLS ты использовать не хочешь. Ну тогда ты его напишешь сам, только частично и через одно место. Вообще для любителей не-TLS’а есть SASL. Обрати внимание на него )

Абстрагируясь от вебсокетов и вообще контекста треда, для взаимной аутентификации кучи сторон лучше было бы взять что-нибудь подходящее для SSO. Типа симметричного кербероса или ассиметричного TLS. Тогда у тебя бы твой пользователь, при наличии нормально настроенной рабочей станции, вообще бы ничего никуда не вводил. Но если твой пользователь коннектится к девайсам из случайных интернет-кафе, тогда конечно да, такой вариант не подойдет.

vasily_pupkin ★★★★★ ()

привет, man-in-the-middle

Ты понимаешь что такое https?

возможно на прокси-https сделать man-in-the-middle

Нет. Для этого нужно уговорить юзера поставить левый корневой сертификат. И ты вообще слышал про hsts + certificate pinning?

т.е. генерь самоподписной сертификат или покупай «кошерный»

letsencrypt

незащищенного соединения

В 2к19 это — решето. Без вариантов.

в local storage браузера хранить

Решето: каждый скрипт из каждого CDN может читать оттуда. Те же cookie могут быть httponly + secure.

Авторизация заключается в регулярной отправке серверу пары логин-хэш

Решето. Во-первых, пассивный mitm получит твою сессию, пусть она и краткосрочная. Во-вторых, активный mitm (если ты не любишь https) спокойно подменит любые ключи.

x3al ★★★★★ ()
Ответ на: комментарий от OnlyAsk

Ну, есть у него ключ и хэш - как он пароль по этому делу вычислит?

Зачем? Достаточно просто использовать этот же хэш.

Это если не заморачиваться чем-то вроде «добавить левый js, который вытянет пароль из браузера при вводе».

x3al ★★★★★ ()
Ответ на: комментарий от OnlyAsk

крутиться демон на С

Привет, сегфолт-ориентированное программирование. Remote code execution на нормальных языках заметно сложнее получить, зачем тебе C?

x3al ★★★★★ ()
Ответ на: комментарий от vasily_pupkin

OK, пусть будет https.

Т.е. забить на все эти web authentication API и сделать как у всех? Прямым текстом шлем серверу пароль/логин, а сервер на основе проверки выдает ключ?

OnlyAsk ()
Ответ на: комментарий от OnlyAsk

Прямым текстом шлем серверу пароль/логин, а сервер на основе проверки выдает ключ

Есть варианты с client-side сертификатами, конечно, но логин/пароль проще для конечного пользователя. Ну и ссылка на нормальный менеджер паролей + нормальная оценка энтропии в пароле ( https://github.com/dropbox/zxcvbn ) делают всё достаточно безопасным.

https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own

https://security.stackexchange.com/questions/168261/what-does-dont-roll-your-own-security-mean

x3al ★★★★★ ()
Ответ на: комментарий от OnlyAsk

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

vasily_pupkin ★★★★★ ()
Ответ на: комментарий от vasily_pupkin

Забить на вебсокеты

Не гоже, т.к. если нужно регулярное общение с железкой и почти рилтайм, то POST не подходит - зачем 10 раз в секунду слать POST, когда можно тупо открыть вебсокет и работать с ним?

клиент сайд сертификаты, без всяких паролей

А сертификат как генерировать и проверять?

будут бока

Что будет?

OnlyAsk ()
Ответ на: комментарий от OnlyAsk

зачем 10 раз в секунду слать POST, когда можно тупо открыть вебсокет и работать с ним?

Можно, а можно лонг полл юзать. Но с вебсокетами конечно приятнее, согласен.

А сертификат как генерировать и проверять?

PKI, openssl на худой конец :))

Что будет?

Возможно будут грабли с wss:// и клиентскими сертификатами. Возможно - потому что редкое сочетание.

vasily_pupkin ★★★★★ ()
Ответ на: комментарий от vasily_pupkin

Вот из-за граблей с wss я и не хотел связываться с https!

Ведь как-то же раньше сайты по http аутентификацию делали. Не открытым же текстом они пароли с логинами отсылали...

OnlyAsk ()
Ответ на: комментарий от Deleted

А зачем?

На всех моих предыдущих веб-мордах надобности в аутентификации/авторизации не было. Теперь вот понадобилось...

Если бы под линукс были вменяемые сишные GUI-библиотеки, написал бы морду, запускаемую по ssh, и не парился с вебом. Но таких библиотек, к сожалению, нет. Поэтому приходится сношаться с вебом.

OnlyAsk ()

Эдуард записался в вэб-макаки? Но постойте, там хоть какой-то мозг и адекватность нужны, хотя бы нат уровне залезть на дерево и сорвать банан.

anonymous ()

В 2019 году говорить о «man-in-the-middle» уже даже неприлично должно быть. HSTS, HPKP и Certificate pinning в 99.9% случаев перечёркивают данный вектор атаки. Актуально может быть только в случае использования сильно устаревших браузеров, но это уже сами дураки и сами виноваты.

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

P.S. Ради интереса можно посмотреть, насколько сильно амазон заморочился с аутентификацией. Но и логин и пароль чего-то в открытую отправляют. Вот дураки наивные.

evgeny_aa ()
Последнее исправление: evgeny_aa (всего исправлений: 3)

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

Спустя много тысяч лет после изобретения - колесо по-прежнему круглое. Неужели ничего путного так ине придумали?

r_asian ★☆☆ ()

ска как же вы задрали

единственно верный вариант - это схема с нулевым разглашением. её не надо изобретать, её надо запилить.

не надо: использовать md5 rc4 и прочие убогие алгоритмы. sha256 использовать можно если у тебя нет лютых секретов.

example_cat ()
Ответ на: комментарий от OnlyAsk

тебе надо узнать что такое схема с нулевым разглашением.

вкратце: это значит что А и Б знают пароль.

А говорит что

х=random();

y=hmac(пароль,х);

и передает Б пару (x,y); Б проверяет совпадает ли y с его вычислениями и так несколько раз. можно 1 раз. если несколько - надо мутить схему когда Б обратно передаёт поправку к random зависящую от результат вычисления текущего y.

example_cat ()
Ответ на: комментарий от OnlyAsk

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

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

example_cat ()
Ответ на: комментарий от example_cat

Я такое и предлагал, а потом меня говном закидали.

Сегодня посидел с примерами libwebsockets - все нормуль, можно смело с wss работать. Разве что через прокси не проверял... Но внутри непроксируемого сегмента сети должно работать - можно будет пароль-логин тупо передавать прямым текстом через вебсокет и так получать токен авторизации, чтобы в следующий раз логин-пароль не вводить...

OnlyAsk ()

Используй TOTP вместо пароля и сертификат от Let’s encrypt.

А ты придумал откровенную фигню - что помешает подменить твой js-код при использовании http? Ничего.

KillTheCat ★★★★★ ()
Ответ на: комментарий от KillTheCat

что помешает подменить твой js-код при использовании http?

Это сработает только на одну сессию. И только при работе с POST-запросами.

В случае вебсокетов mitm ничего сделать, не зная пароля, не сможет: ну, приконнектится он к вебсокету, и что дальше? Для аутентификации сервер зашлет ему рандомную фразу. Клиент должен будет в ответ выслать логин и sha512 от пароля с ключом - этой рандомной фразой. Фигвам!!!

OnlyAsk ()

В общем, в случае с вебсокетами никаких wss не нужно. Аутентификация происходит при коннекте и никакой mitm не страшен. Единственный вариант выдрать хэш пароля - это взломать компьютер авторизованного пользователя и посмотреть в его local storage (но этот вариант я вообще не рассматриваю - бред же полный!).

От слишком любознательных студентов и «мамкиных какеров» данный способ спасет, мне это и нужно.

В случае с POST-запросами выше уже тоже все сказали: нужно использовать https и не парить людям мозг!

OnlyAsk ()
Ответ на: комментарий от OnlyAsk

Это сработает только на одну сессию. И только при работе с POST-запросами.

Если хочешь держать свой сайт на http - как ты пользователю передашь js с вебсокетами так что-бы твой js не смог подменить любой мамкин какер? Тут можно и mitm сделать и dns подменить, а в фейковом скрипте уже не будет твоего wss - он получит логин\пароль и сольет их куда надо. Тут только свой клиент на открытых ключах (как в ssh) поможет.

И чем тебе TOTP с https не нравится? TOTP, andOTP. Пароли - это ретроградство и ненадежно.

KillTheCat ★★★★★ ()
Ответ на: комментарий от KillTheCat

А как он подменит мой js, чтобы правильно пароль ввести? Никак!

И чем тебе TOTP с https не нравится?

Чем проще, тем лучше! Самый простой и невзламываемый вариант уже озвучили: работать с вебсокетами по https. Следующий вариант (если нужны не вебсокеты, а запросы) - классика с https.

OnlyAsk ()
Ответ на: комментарий от x3al

Это если не заморачиваться чем-то вроде «добавить левый js, который вытянет пароль из браузера при вводе».

А зачем вводить пароль в браузер и вообще в ПК в целом?
Пусть сервер присылает QR код, который просканировать специальным девайсом с камерой, который после ввода пароля пользователем выведет на свой экран ответный QR код который через вебкамеру будет отправлен на сервер.

(Девайс может быть как специальным, так и простым смартфоном на который поставлена соответствующая программа)

torvn77 ★★★★★ ()

Насколько я понимаю в твоем случае сервер должен хранить plain text пароль пользователя, что само по себе является довольно сомнительной практикой. И в целом предложенный тобой алгоритм – это аналог CHAP, CRAM-MD5 и подобного.

Думаю можно попробовать изобразить какой-нибудь Encrypted Key Exchange на JS (например DH-EKE), который основе пароля выработает идентификатор сессии который далее будет использоваться в запросах. Только готовых реализаций что-то не находится, вероятно мало настоящих параноиков которые готовы доверять javascript’у.

Наверное причина тут в том, что MITM может не только пассивно слушать, но и подселить свой код который утянет пароль прямо из формы. Так что единственное что можно сделать это надеяться на TLS, потому как если его сломали то пароль уже не спасти (средствами JS).

Реально работающая защита – использовать одноразовые пароли, но тут уже возникает вопрос useability vs security.

maxcom ★★★★★ ()
Последнее исправление: maxcom (всего исправлений: 3)
Ответ на: комментарий от torvn77

Если есть внешнее устройство, то тут уже полно вариантов.

Есть масса разных one time password, у которых есть реализация или для смартфона, или в виде железного токена.

maxcom ★★★★★ ()
Последнее исправление: maxcom (всего исправлений: 1)