Стандарт Web Authentication API: беспарольная аутентификация в вебе / Хабр

Выход: а что это такое

В современных приложениях на смартфоне сложно найти кнопку или значок для выхода, а зачастую это вообще невозможно. На компьютере обычно есть параметр «Выход», но многие пользователи никогда не используют эту возможность. Один раз зашли и больше никогда не выходят. Это хорошо, если техника всегда работает, никогда не подводит, либо не нужно заводить второй аккаунт на сайте.

Что такое регистрация

Регистрация – это необходимый этап для того, чтобы пользователь получил доступ к тем возможностям, которые предоставляются на каком-либо интернет-ресурсе. Регистрацию проходят только один раз (в идеале). После того, как человек ее прошел, ему становятся доступны те возможности, которые имеются на данном ресурсе.

Что требует авторизации
#

Авторизовать необходимо любое действие, которое пользователь может выполнить с приложением:

  • Просмотр данных
  • Редактирование данных
  • Удаление данных
  • Добавление данных

То есть необходимо проверять возможность выполнения любой ПРУД-операции

А кстати, почему это srp вдруг крут?

Чтобы понять это, необходимо вначале глужбе его изучить. Сравнить с другими методами и протоколами.

Злоумышленник не сможет сделать ничего, даже если взломал сервер и активно контролирует канал. Это очень круто.

Немного воды или, что же автор хотел всем этим сказать?

В преамбуле к статье я писал, что занимаюсь дурью проектирую протокол беспарольной аутентификации в Web, который бы сильно облегчил всем нам (конечным пользователям сайтов) жизнь, избавляя от парольного ада. И эта статья написана, чтобы  «раскрывать причины технических решений, закладываемых в новый протокол». Так вот, касаемо схемы авторизации, я делаю ставку на SRP.

На самом деле протоколов авторизации гораздо больше, чем было описано выше. Но SRP – это, на мой взгляд, самая крутая схема, созданная профильным специалистом, выпускником Стэндфордского университета (Thomas Wu), и проверенная его коллегами и другими специалистами по безопасности.

Возникает закономерный вопрос? Если эта схема такая крутая и древняя, почему она не получила до сих пор широкого распространения.

Я думаю, что этот протокол просто опередил свое время. Тогда аутентификацию предполагалось выполнять на клиенте в браузере. А javascript находился в зачаточном состоянии и мог, в лучшем случае вывести алертом «hello word». А нужна была арифметика на больших числах. Сейчас уже есть, но время упущено.

И самое главное, веб сообщество до сих пор не осознало, что процесс аутентификации необходимо выносить за рамки прямого взаимодействия сервер–браузер (равно как и аутентификацию в иных системах). В самом деле, ведь никто в здравом уме не хотел бы реализовывать вручную TLS  (на javascipt/PHP/JAVA)?

И если это осознать, то не трудно видеть, что гораздо более правильным решением, поступить также с аутентификацией: создать протокол более низкого уровня, заточить его на использование парольных менеджеров (как сейчас менеджеры сертификатов и криптопровайдеры).

Хешируем

Ну хорошо. Попробуем усилить элементарную схему. Первое, что приходит на ум: будем передавать не пароль P, а его хэш H. И сервер будет хранить не исходный пароль, а его хеш. Теперь исходный пароль пользователей не сможет узнать ни MitM, ни взломщик БД.

Для надежности, возьмём в качестве хеширующей функции SHA2 или SHA3. 256-битов на текущий момент вполне достаточно. Но если хотите – обе функции поддерживают режим 512 бит. Хотя признаться, такое количество бит потребует сделать в БД поле размером в 64 байта!

Хорошо. Вот только злоумышленнику MitM не нужно уже знать пароль – ему достаточно узнать его хэш. Мало того, если пользователь использует такой же пароль на другом сайте, и тот сайт использует подобную “защиту”, то MitM и там может “поживиться” (ему уже не обязательно взламывать канал, достаточно зайти “легально”).

Солим

В терминах криптографии, “соль” – это последовательность случайных бит, которые добавляются к хэшируемой (или шифруемой) последовательности для “рандомизации” результата. Добавляя соли к паролям при хешировании, мы будем получать разные хэши для одинаковых паролей. Ну при условии, конечно же, что соль используется разная:

hash(password,salt_1) ne hash(password, salt_2)

Scrypt’им

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

Производительность компьютеров растет. И хотя закон Мура давно как не действует (по слухам, с 2006 года), и рост уже не экспоненциальный, на “плато” мы ещё не вышли. То что ранее считалось невозможным, теперь доступно многим. Например, аренда на время вычислительных кластеров с фантастической мощностью.

поговаривают, что

количество хешей, которое обсчитывается в сети Bitcoin каждые три секунды, достаточно, чтобы найти коллизию для SHA-1. Источник.

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

Как? В начале по таблице известных паролей: синтетических qwerty, популярных 123 и когда-то угнанных реальных. Затем, путём тупого перебора символов из заданного алфавита. Алгоритм концептуально прост: берем пароль-кандидат, вычисляем hash( password, salt ), сравниваем результат. Соль учетной записи известна, ибо хранится рядом с хешем пароля.

На нашу беду, процесс перебора хорошо параллелится. А значит, в теории рост производительности не ограничен (правда только в теории; практика – вещь куда более суровая).

Вот для примера расчеты

Этой проблемой озадачились уже достаточно давно. И в результате усилий криптографов, на свет появилась такая функция как scrypt.

Функция scrypt делает почти тоже самое, что и хэш-функция (на самом деле использует в качестве базы SHA2-256), но создана таким образом, чтобы усложнить атаку перебором при помощи ПЛИС: FPGA, ASIC и подобных. Она заставляет использовать в алгоритме много циклов и ветвлений (чего суперскаллярные процессоры крайне не любят), к тому же, требует слишком много памяти на одно ядро.

Поэтому, вместо стандартной хеширующей функции, мы будем использовать scrypt. WebCryptApi пока её не поддерживает, но для javascript-разработчиков есть уже реализованные библиотеки. В остальном схема взаимодействия пока остается прежней. И вроде бы, надежной.

Но защитит ли она от пассивного MitM? Нет. Ибо мы всё ещё посылаем на сервер всегда один и тот же хеш. А значит, перехватив передачу итогового хеша на сервер, злоумышленник может в последствии легально его использовать для входа под чужой учеткой.

Добавляем challenge

Ну хорошо. Давайте усложним жизнь и для MitM. Попытаемся добиться того, чтобы хеш от пароля на сервер передавался всегда разным. Как? А давайте «посолим» уже сам хэш! Тот самый, что нам дает функция scrypt( password, salt ). Для этого сервер сгенерирует и пошлет клиенту случайную последовательность байт (длина которой равна длине блока хеширующей функции), которую мы (по традиции) назовем challenge. Теперь схема взаимодействия клиента и сервера такова:

Обоюдный challenge

Казалось бы где тут подвох? Да почти нигде. Вот только, что если наш злоумышленник MitM вклинится в момент аутентификации и поменяет challenge от сервера на более простой (например – все нулевые биты, или вообще пустой)? Зачем? А чтобы попытаться облегчить себе задачу обратного восстановления H из Hs.

Защититься от такой потенциальной атаки можно, если клиент будет генерировать свой challenge и использовать его для хеширования пароля. Теперь на шаге 2, клиент вычисляет Hs = hash(H,server-challenge,client-challenge) и отправляет Hs вместе со своей версией challenge.

Финальный штрих

Некоторые, возможно, уже заметили, что даже такая усложненная схема авторизации не защищает нас от взломщика БД. Последний может использовать компрометированные хеши пользователей и соли для легального входа от имени пользователей. Можно ли как-то от этого защититься?

Можно. И даже более того. Фактически мы можем сделать так, что угон аутентификационных данных пользователей будет бессмысленным. Компрометация этих сведений не принесет взломщику ничего (ну правда, он может «поживиться» куда более ценными сведениями; например данными сохраненных кредитных карт и cvc-кодами для них; но мы ведь защищаем процессы авторизации, а не проектируем PCI DSS).

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

КРАЙНЕ ВАЖНОЕ ЗАМЕЧАНИЕ: если вдруг кому-то покажется интересной какая-то из двух рассмотренных далее схем, ни в коем случае не спешите внедрять. Внимательно изучите сравнительную таблицу недостатков и уязвимостей. Опять же, не забывайте про опасность использования «учебных» криптопротоколов. Я предупредил.

А Схема защиты на симметричных ключах

Пусть H – это тот самый хеш клиента, по которому сервер его аутентифицирует. H хранится на сервере. H может быть потенциально стать доступным взломщику БД.

Пусть клиент имеет некий ключ K, которым он зашифровывает свой исходный аутентификационный хеш H: V = EK(H), где E – функция шифрования на ключе K. Итоговый шифр V вместе с H сервер хранит в своей БД. Если алгоритм шифра выбран надежный, то из пары (V, H) восстановить исходный ключ почти невозможно.

Теперь в процессе аутентификации нам остается передать защищенным образом пару (H, V) серверу. Тот сверит H, расшифрует V и убедится, что мы действительно знаем ключ К, а не украли H при взломе БД. 

Это был концепт. Теперь конкретика. 

Определим функцию hmac как функцию HMAC-SHA2-256. Salt и challenge должны быть равны длине блока хеширующей функции. В нашем случае – 256 бит. Определим функцию E – как функцию шифрования, а функцию D – как функцию расшифровывания на базе симметричного шифра AES-256.  Наконец, определим функцию scrypt, как функцию, возвращающую 256-битный хеш от пароля и его соли.

Похожее:  Регистрация и Авторизация на PHP MySQL

На стороне клиента производятся предварительные вычисления:

  1. Защитим исходный пароль пользователя, вычислив H_p=scrypt(password,salt).

  2. Сформируем аутентификационный хеш H=hmac_{H_p}(login).

  3. Сформируем код подтверждения .

  4. Сформируем шифр аутентификационного хеша V = E_K (H).

При регистрации клиент посылает серверу пару (H, V) в открытом виде. Заметим, что сервер не знает ни исходный пароль пользователя, ни его первичный хеш Hp.

Алгоритм авторизации клиента теперь такой:

Openid connect
#

Протокол OpenID Connect является расширением протокола OAuth 2.0, предоставляющий слой для идентификации пользователя после авторизации на идентификации провайдера

Протокол поддерживает следующие потоки авторизации:

  • Неявный поток авторизации, подходит для одностраничных приложений
  • Базовый поток авторизации, подходит для серверных приложений
  • Поток предоставления доступа через пароль, для случая отсутствия доступа к веб-браузеру
  • Поток предоставления учётных данных, для авторизации действий машин

Рассмотрим первые два потока, предназначенные для пользовательских приложений

Авторизация в рамках пользовательского интерфейса
#

Потенциально можно реализовать две стратегии в организации интерфейса

  • Предоставлять всем пользователям все элементы управления
  • Предоставлять пользователям доступ только для действий, которые они могут выполнить

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

Авторизация во время выполнения конкретного запроса
#

Как и в случае с аутентификацией, авторизация должна происходить при каждом отдельном запросе от клиента к серверу

Авторизация действий в веб-приложениях
#

Васильев Андрей Михайлович, 2022

Версии презентации

Авторизация с помощью подключенного устройства


Авторизация с помощью подключенного устройства — это идентификация через Bluetooth (или нечто подобное), то есть присоединение одного устройства к другому, которое уже идентифицировало пользователя.

Например, для Mac OS X есть приложение KeyTouch, позволяющее авторизоваться на компьютере со сканом отпечатков пальцев со своего iPhone. Есть еще и Knock, который позволяет кликнуть по телефону, чтобы разблокировать компьютер.

Можно представить себе, сколько возможностей даст накопление числа подключенных устройств, особенно в пространстве «интернета вещей», где персональные и, возможно, подключеные устройства будут работать постоянно. Идентификация с помощью подключенных устройств может стать очень полезной.

Стандарт Web Authentication API: беспарольная аутентификация в вебе / ХабрПриложение Tether для iPhone


В домашнем офисе я использую приложение Mac OS X и iOS под названием Tether («связка»). После однократной синхронизации компьютера и телефона компьютер блокируется и разблокируется — в зависимости от близости телефона к компьютеру.

Tether сэкономил мне массу времени. Набор моего пароля с заглавными буквами, цифрами и символами может занять всего три или четыре секунды, но много раз повторять это каждый день, неделю и месяц — это уже слишком. Благодаря идентификации подключенного устройства к тому времени, когда я сажусь в кресло, мой компьютер уже разблокирован. Еще один пример — ключи от машины с Bluetooth.

Авторизация: вход после регистрации

Регистрацию проходят один раз. Потом для входа на какой-либо ресурс следует пользоваться кнопкой «Авторизация».

Базовый поток авторизации
#

В рамках данного потока взаимодействие провайдера идентификации включает взаимодействие с серверным приложением

Беспарольная авторизация

Беспарольная авторизация — это двухфакторная идентификация без первого шага. Нужно помнить свое имя пользователя, адрес электронной почты или номер телефона, после чего пользователь получает уникальный код для завершения входа. Он не создает пароль и не вводит его.

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

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

Стандарт Web Authentication API: беспарольная аутентификация в вебе / ХабрАвторизация в Slack

У Slack есть очень хороший пример беспарольной идентификации. На разных этапах входа в систему и процессов сброса пароля сервис использует «волшебную ссылку» (magic link) для идентификации пользователей. Уникальный URL отправляется на электронный адрес пользователя, и этот URL открывает приложение и позволяет ему войти.

Примечательна сама презентация этой модели взаимодействия: она представляет контакт пользователя с системой как «магию», упрощая его и успокаивая пользователя (вероятно, придумавший «двухфакторную идентификацию» неправильно понял ее брендинг).

Биометрическая идентификация

Отпечатки пальцев, сканы сетчатки глаза, распознавание лица, голоса и многое другое — все это биометрическая авторизация.

Наиболее распространенный пример — Touch ID компании Apple. Такие вещи действительно восхищают. Биология — наша истинная идентичность, она всегда с нами. Мы знаем об идее разблокирования телефонов или планшетов при помощи отпечатка пальца. Тем не менее биометрическая идентификация используется и в других местах (и с другими параметрами).

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

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

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

Биометрическая идентификация только начинает развиваться, но некоторые API и библиотеки позволяют нам пользоваться биометрической идентификацией уже сегодня. К ним относятся BioID Web Service, KeyLemon, Authentify и Windows Biometric Framework API (на котором, как мне кажется, построена Hello).

Вконтакте: регистрация и войти

ВКонтакте Регистрация и Войти
Рис. 6. ВКонтакте: Регистрация и Войти.

Чтобы создать новую страничку ВКонтакте, следует ввести имя, фамилию, указать дату рождения и нажать на зеленую кнопку «Продолжить регистрацию».

Для входа на свою страничку, ранее уже зарегистрированную, следует ввести телефон или email, пароль и нажать «Войти».

Дополнительные материалы:

1. Зачем нужна регистрация на сайте?

2. Регистрация на сайте Одноклассники: пошаговые советы

3. Регистрация на сайтах в 2 клика через автозаполнение Яндекс браузера

4. Проблемы с входом в соцсети: причины и решения

Выбор подхода к авторизации
#

В рамках учебных приложений будем использовать подход с определением ролей

  • Минимальный объём по настройке прав — только указание роли
  • Не требуется создания дополнительного интерфейса для управления ролями

Для распределения ролей будет достаточным отредактировать хранилище напрямую

  • При создании графического интерфейса доступ к нему должен быть обеспечен только пользователям с ролью «администратор»
  • Для создания первого администратора можно
    • Создать специальную команду по редактированию данных в хранилище
    • Назначить первого созданного пользователя администратором

Выдача прав группам
#

Данная схема похожа на схему выдачи прав ролям, однако она более сложная:

  • Каждый пользователь может принадлежать нескольким группам
  • Между группами может быть сложная иерархическая связь, то есть одни группы могут входить в другие группы
  • Потенциально группам можно не только явно разрешать, но и явно запрещать доступ к функциям

Выдача прав доступа ролям
#

В рамках приложения выделяется концепция «роли», которая может выполнять разумный связный набор действий внутри предметной области приложения

Использование роли является логичным продолжением использования сценариев использования и пользовательских историй для описания функциональности приложения

  1. Выделяются действия, требующие авторизацию
  2. Для каждой роли определяется возможность выполнения действий

Каждому пользователю системы назначается роль

Выделения прав в системе
#

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

  • При статической организации трудно поддержать большое количество различных ролей внутри приложения
  • Для поддержки динамического распределения ролей необходимо предоставлять отдельный графический интерфейс, доступ к функциям которого тоже надо авторизовать

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

Ввиду востребованности и требований обеспечения безопасности системы задачу по выделению прав выносят в отдельную систему с которой взаимодействуют по ряду протоколов: SAML, OpenID Connect и т.д.

Двухфакторная авторизация

Двухфакторная идентификация — это еще одно расширение традиционной идентификации при помощи пароля. После проверки комбинации имени пользователя и пароля уникальный код или URL пересылается по электронной почте либо отправляется SMS-сообщением владельцу аккаунта, который пытается войти в систему.


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

Стандарт Web Authentication API: беспарольная аутентификация в вебе / ХабрАвторизация в приложении Google

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

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

Google хорошо справляется с идентификацией. Компания используют правило «Доверять этому устройству 30 дней». Кроме того, она предлагает опцию двухфакторной аутентификации как один из вариантов и поощряет его применение, ни к чему не принуждая пользователей.

Похожее:  Опыт заказа и возврата товара на Яндекс.Маркет: привезли не тот товар — Приёмная на

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

Идентификация, аутентификация, авторизация
#

  • Идентификация — процедура, в результате выполнения которой для субъекта идентификации выявляется его идентификатор, однозначно определяющий этого субъекта в информационной системе
  • Аутентификация — это процедура проверки подлинности субъекта, например путём сравнения введённого им пароля с паролём, сохранённым в базе данных
  • Авторизация — предоставление субъекту прав на выполнение определённых действий

Истоки проблемы

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

Приложения SaaS, социальные сети и другие службы требуют соблюдать строгие правила введения паролей, которые затрудняют вход в систему для честных пользователей. Неужели авторизация вида «имя пользователя и пароль» настолько незаменима, что мы готовы смириться с этим препятствием при использовании сервисов и продуктов?

Дело не в самих паролях — проблема заключается в масштабе, ведь людям приходится запоминать множество имен и паролей, они испытывают дискомфорт. А мы не хотим, чтобы наши продукты стали менее безопасными, когда мы понизим стандарты защиты в угоду удобству пользователей. Как же обеспечить надежную безопасную идентификацию и защиту конфиденциальных данных?

Для этого уже есть несколько методов и постоянно появляются новые. Традиционную аутентификацию при помощи пароля можно сделать комфортной и удобной. Вот актуальные способы:

  • имя пользователя и пароль;
  • кодовая фраза;
  • двухфакторная идентификация;
  • социальный вход;
  • беспарольная авторизация;
  • биометрическая идентификация;
  • подключенное устройство.

Я буду оценивать каждый метод, исходя из нескольких факторов:

  • частота использования: легкость настройки и обслуживания;
  • безопасность: сложность идентификации для постороннего человека;
  • комфорт: простота идентификации для пользователя аккаунта.

Кодовая фраза

Стандарт Web Authentication API: беспарольная аутентификация в вебе / Хабр

Секретные фразы безопаснее паролей, их легче запомнить. Об этом пишут уже больше десяти лет: от статьи «
Пароли-слова против паролей-фраз» в 2005 году до «Почему секретные фразы удобнее для пользователей, чем пароли» в 2022-м.

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

Хотите доказательств?
Zxcvbn — это проект Dropbox, определяющий надежность пароля. Другие сайты могут использовать Zxcvbn как определитель надежности пароля с открытым исходным кодом. В этой статье Dropbox есть статистика и сведения об истинной надежности различных паролей.

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

Впервые я использовал пароли-фразы с компанией интернет-банкинга
Simple, которая приветствует эксперименты и новые технологии, и они показали себя прекрасно. Мою фразу-пароль просто запомнить и легко набрать — особенно на мобильном телефоне.

Конкретизировать сообщение об ошибках ввода

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

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

Ложка дёгтя в бочке мёда.

Есть одна проблема – математическая. Эллиптические кривые используются в криптографии относительно недавно и ещё слабо изучены. Даже сами математики говорят, что теория эллиптических кривых только развивается. Не случайно, что самые крупные достижения в математике последних лет (теорема о модулярности эллиптических кривых, приведшая к доказательству известного Диафантова уравнения,  [всё ещё спорное] доказательство ABC-гипотезы) тесно связаны с эллиптическими кривыми.

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

Обнадёживает тут только то, что даже если эллиптическая кривая «подведёт», пароль пользователя всё ещё находится под надёжной защитой благодаря scrypt и hmac.

Напоминать пользователю о правилах

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

Стандарт Web Authentication API: беспарольная аутентификация в вебе / ХабрАвторизация на cайте BrowserStack

Именно эта модель безопасности долгие годы медленно меня убивает. Я гораздо тщательнее многих слежу за своими паролями, но всё равно их забываю. Если добавить такую форму напоминания в окно авторизации, это значительно увеличит юзабилити сайта и количество успешных авторизаций.

Неявный поток авторизации
#

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

sequenceDiagram
participant client as Клиент
participant provider as Провайдер идентификации

client ->> provider: Запрос на аутентификацию с передачей идентификатора клиента
provider ->> client: Показывает интерфейс для аутентификации
client ->> provider:

  • Передача данных осуществляется по зашифрованному соединению, поэтому данный поток безопасен
  • Для привязки ключа используется набор из доменного имени, ключа клиента и асимметричного шифрования на стороне провайдера идентификации

Ограничивать или исключать правила для паролей

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

Стандарт Web Authentication API: беспарольная аутентификация в вебе / ХабрРегистрация на сайте GoDaddy

В США и Великобритании 73% взрослых людей
используют на всех своих аккаунтах один и тот же пароль. Если ваши правила не дают пользователю использовать его стандартный пароль — он создает уникальный и, как правило, очень быстро его забывает. Исключив правила для паролей, вы даете пользователю возможность помнить пароль, чем повышаете юзабилити своего сервиса.

Зачем нам навязывают этот комплекс правил? Существуют исследования, которые утверждают, что длинные пароли эффективнее паролей с различными символами, но об этом я расскажу позже.

Показывать напечатанные символы скрытого пароля с возможностью их убрать

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

Если кто-то использует функцию общего доступа к экрану или проводит презентацию, можно спрятать символы при вводе пароля, но таких пользователей единицы. Всем остальным удобнее видеть, какой пароль они набирают. Такой метод успешно применяют Yahoo и Sprint — это убедительно доказывает, что нам больше не нужно маскировать пароли.

Стандарт Web Authentication API: беспарольная аутентификация в вебе / ХабрПодсказки Люка Вроблевски


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

Поток авторизации
#

При выполнении действий и при показе пользовательского интерфейса необходимо проверить разрешения для текущего аутентифицированного пользователя

  • Выполнять запрос на проверку авторизации при каждом запросе
  • Формировать полный список разрешений, который может быть использован внутри слоя обработчиков и внутри уровня представления

При использовании второго подхода можно логику по вычислению списка разрешений делегировать фильтру и сохранять их в контекст обработчика

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

Стандарт Web Authentication API: беспарольная аутентификация в вебе / ХабрТри способа беспарольной аутентификации в облаке Azure по токену YubiKey: одна из первых практических реализаций нового стандарта Web Authentication API

WebAuthn разработан совместно с альянсом FIDO (Fast IDentity Online) и становится ключевым компонентом проекта FIDO2, вместе со спецификациями Client to Authenticator Protocol (CTAP) для аутентификации между устройствами, device-to-device.

Процедура редактирования данных
#

sequenceDiagram
participant client as Клиент
participant server as Веб-приложение

client ->> server : GET-запрос на редактирование
alt Пользователь авторизован на выполнение действий
server ->> client : HTML-документ с формой, заполненной данными
else
server ->> client :

Ответ с кодом 403, доступ запрещён
end
client ->> client : Заполнение формы
client ->> server : POST-запрос (PUT) с данными формы
alt Данные формы верны
server ->> client : Перенаправление на страницу ресурса
else
server ->> client :

Процедура удаления данных
#

sequenceDiagram
participant client as Клиент
participant server as Веб-приложение

client ->> server : GET-запрос на удаление элемента
alt Пользователь авторизован на выполнение действия
server ->> client : HTML-документ с формой подтверждения удаления
else
server ->> client :

Ответ с кодом 403, доступ запрещён
end
client ->> server : POST-запрос (DELETE)
alt Пользователь авторизован на выполнение действия
server ->> client : Перенаправление на страницу списка
else
server ->> client : Ответ с кодом 403, доступ запрещён
end

Процесс аутентификации
#

Стоит учитывать, что авторизация возможна только после авторизации

Поток идентификации и аутентификации в веб-приложении

sequenceDiagram
participant client as Клиент
participant server as Веб-приложение

server ->> client : Форма входа в приложение
client ->> server : Корректные данные пользователя
server ->> server : Создание сессионного токена
server ->> client : Передача сессионного токена в куках

Похожее:  Как узнать сколько денег на сберкнижке Сбербанка через интернет

Сессионный токен удобно оформить в виде JWT-токена, чтобы уменьшить объём данных, которые надо сохранять на сервере для выполнения авторизации

Прямая выдача прав
#

В рамках приложения выделяются действия, требующие авторизацию

Затем выполняется выдача прав одним из возможных способов:

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

Реализация ролей
#

Внутри приложения для реализации ролей можно использовать следующий подход:

  • Сформировать список действий, для которых необходимо обеспечить авторизацию.
  • Сформировать класс с полями для сохранения логических значений, которые показывают разрешено или запрещено данное действие.
  • Создать объекты данного класса, содержащие корректные поля для каждой роли. Данные объекты лучше сделать константными внутри контекста приложения.

Ржд: регистрация или вход

РЖД Регистрация и Вход
Рис. 3. Сайт РЖД: Регистрация и Вход. Показана открытая вкладка «Вход».

РЖД является сокращением от «Российские Железные Дороги». Сайт РЖД предназначен для получения информации о поездах, расписании, наличии мест. Для приобретения билетов на поезд необходимо создать личный кабинет на сайте РЖД, он называется «Мои заказы».

Для создания личного кабинета РЖД, а также для входа в правом верхнем углу на сайте РЖД есть единая кнопка «Вход» (цифра 1 на рисунке 3). Кликнув по ней, появятся две вкладки «Вход» (3 на рис. 3) и «Регистрация» (2 на рис. 3).

Чтобы создать новый личный кабинет, следует нажать «Регистрация».  В новом кабинете «Мои заказы» НЕ будет билетов, приобретенных ранее на сайте РЖД. После регистрации там можно будет только купить новый билет.

Для доступа к прежнему кабинету, надо использовать кнопку «Вход». Там можно найти билеты, приобретенные ранее на сайте РЖД, а также купить новые билеты.

Ростелеком личный кабинет: зарегистрироваться и войти

Зарегистрироваться Ростелеком Войти
Рис. 4. Кнопки «Зарегистрироваться» и «Войти» в личный кабинет на сайте Ростелекома.

На сайте Ростелекома  можно создать новый личный кабинет с помощью кнопки «Зарегистрироваться» (цифра 1 на рисунке 4). В личном кабинете можно проводить оплату, получать и тратить бонусы, писать запросы в техподдержку и т.д.

Социальный вход

Социальный вход или вход через авторитетный проверенный сайт — популярный и удобный способ идентификации. Он предназначен не только для входа в систему. У American Express есть Amex Express Checkout, откуда вы входите на свой Amex-аккаунт, чтобы безопасно оплачивать товары на сторонних сайтах. Вы идентифицированы, и уже не нужно отправлять данные кредитной карты продавцу.

Схема авторизации на ассиметричных ключах и эллиптических кривых

Пусть в процессе аутентификации клиент подпишет случайную строку message своим закрытым ключом e. А сервер проверит подпись клиента, зная его открытый ключ D. Но если клиент может таким образом доказать, что ключ D принадлежит ему, и только ему, то нам уже не нужно «заморачиваться» с хранением хэша от пароля!

Схема на базе протокола srp

SRP — протокол парольной аутентификации, устойчивый к прослушиванию и MITM-атаке и не требующий третьей доверенной стороны. Имеет свой RFC2945. Есть производные от него стандарты для протоколов Telnet, TLS. Единственный из представленных, который проводит окончательную взаимную авторизацию обеих сторон. Хорошо описан как в Википедии, так и на Хабре пользователем @datacompboy.

Тем не менее, для генерации секретного ключа x протокол использует устаревшие подходы: (уже  не криптостойкую) функцию SHA-1 и  простую схему хеширования: x = hash(salt | hash(login | ‘:’ | pass). В свете современных тенденций к взлому паролей брутфорсом офлайн на специализированных ПЛИС или арендованных кластерах, данный подход должен быть улучшен, использованием scrypt.

Для реализации схемы нам понадобятся: большое простое число N, генератор g мультипликативной группы Z*N и параметр k = hash(N, g). В качестве g и N стороны используют числа, определенные в RFC-5054. Так, например, g = 2, а «мультипликативная группа» – это просто степени двойки; точнее их остатки по модулю N.

Процесс регистрации пользователя в системе:

  1. Клиент отправляет серверу свой login и свою 256-битную версию соли saltC.

  2. Сервер генерирует свою 256-битную версию соли saltS для пользователя login.

  3. Клиент формирует общую 256-битную соль: salt = saltC ^ saltS.

  4. Клиент вычисляет секретный 256-битный ключ x = scrypt(password, salt) от своего пароля

  5. Клиент вычисляет верификатор пароля V = gx (mod N).

  6. Клиент посылает на сервер пару (saltC, V).

  7. Сервер вычисляет общую соль salt аналогично клиенту в п. 3.

  8. Сервер хранит учетные данные пользователя в форме: login, salt, V.

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

  1. Клиент формирует случайное 256-битное число a и вычисляет 2048-битное A = ga (mod N).

  2. Клиент делает запрос на сервер со своим login, и числом А.

  3. Сервер формирует случайное 256-битное число b и вычисляет 2048-битное B = (kv gb) (mod N).

  4. Сервер посылает клиенту пару (salt, B).

  5. Обе стороны вычисляют u = hash(A | B). В оригинальном RFC указано, что параметр u – 32-битное беззнаковое, получаемое от результата примененной хеш-функции hash(A | B).

  6. Пользователь вычисляет свой ключ x на основе пароля и соли, аналогично пп. 4 процесса регистрации.

  7. Пользователь вычисляет сессионный ключ K следующим образом: S = (B – kgx)a ux (mod N); K = hash(S).

  8. Сервер вычисляет сессионный ключ K следующим образом: S = (Avu)b (mod N); K = hash(S).

  9. Пользователь вычисляет M1 = hash( hash(N) ^ hash(g) | hash(login) | salt | A | B | K ) и отправляет на сервер.

  10. Сервер дождавшись от пользователя M1, проверяет его, производя аналогичные п. 9 вычисления.

  11. Сервер вычисляет M2 = hash( A | M1 | K ) и отправляет клиенту.

  12. Клиент проверяет M2 сервера. На этом этапе аутентификация считается завершенной.

В функции hash операция | означает конкатенацию аргументов. Если предполагается, что ключ K не будет использоваться в дальнейшем взаимодействии (например, для шифрования или аутентификации пакетов), то пп. 9-12 к исполнению обязательны. А если будет, то проверка излишняя, т.к. несогласованный ключ не позволит проводить корректное взаимодействие. Но я бы всё-таки оставил эти пункты обязательными.

Согласно спецификации, пользователь должен прервать аутентификацию, если получил B = 0 (mod N) или u = 0. (Полагаю, что B не должно быть также равно –kV, т.к. в этом случае клиент получит S = 0a ux (mod N) = 0).

Сервер должен прервать аутентификацию, если получил A = 0 (mod N). Клиент должен первым доказать, что получил тот же ключ K. Если клиенту это не удалось, сервер должен прервать аутентификацию, без своего доказательства K.

Схемы предоставления прав доступа
#

Права доступа всегда относятся к конкретному субъекту, но существует несколько подходов к установлению связи между субъектом и правами

Можно выделить следующие общие подходы предоставления прав доступа:

  • Прямая выдача прав на выполнение операций пользователю
  • Выдача прав роли и ассоциация пользователя с одной ролью
  • Выдача прав группам и включение пользователя в несколько групп

Универсальный аутентификатор

По протоколу CTAP внешний аутентификатор (например, криптографический токен) передаёт зашифрованные учётные данные на локальное устройство, подключённое к интернету (компьютер или мобильный телефон) по USB, Bluetooth или NFC.

Фактор владения данными
#

Представленная схема обеспечивает доступ ко всем функциям «по умолчанию», то есть обычный пользователь не может удалять или редактировать записи

Значимым исключением из данной практики является фактор владения объектом. Если пользователь является владельцем, то он может выполнять расширенный набор действий

Для определения права владения:

  • Необходимо получить запрашиваемый объект
  • Сопоставить аутентифицированного пользователя и объект, выявить факт владения
  • Использовать информацию о базовых разрешениях и факторе владения

Проверку на владение можно проводить исключительно на уровне обработчика

Фейсбук: создать аккаунт и вход

Создать аккаунт Фейсбук Вход
Рис. 5. Фейсбук: Создать аккаунт и Вход.

Юмани: создать кошелек и войти

создать новый кошелек Юмани войти
Рис. 2. В Юмани можно создать новый кошелек или войти в прежний кошелек.

Юмани – это электронные деньги, которые ранее были Яндекс.Деньги. Потом сервис был приобретен Сбербанком и сменил название. Были Яндекс.Деньги, стали Юмани.

Кнопка «Создать кошелек» (цифра 1 на рисунке 2) означает появление нового кошелька, как правило, с нулевым балансом. Другая кнопка «Войти» (2 на рис. 3) позволяет войти в старый кошелек. Возможно, там уже есть рубли и накопленные баллы.

Яндекс почта: создать id и войти

Создать ID в Яндекс Почте Войти
Рис. 1. «Создать ID» и «Войти» в Яндес.Почте.

В Яндекс.Почте кнопка «Создать ID» (цифра 1 на рис. 1) служит для регистрации нового почтового адреса (email). ID  (читается «ай-ди») — это часть английского слова «identifier», что можно перевести как «идентификатор».

Подведём итоги

Параметр / Схема

1. Симметричная на базе HASH

2. На базе ECDSA

3. SRP-6a

Скорость

Проверка на сервере реализуется быстрее

Проверка подписи на стороне сервера в 2 раза медленнее клиента

Медленная, требует длинной арифметики и 4 пакета для завершения аутентификации

Технические сложности

Отсутствуют; может быть реализована на нативном js; работает достаточно быстро.

Отсутствует поддержка произвольной кривой в WebCryptoApi на клиенте

Уже никаких

Потенциальные уязвимости

Уязвима к компрометации БД и последующему контролю канала сервера; уязвима в процессе регистрации пользователя

Существуют классы уязвимых эллиптических кривых. Методики оценки безопасности кривых ещё не разработано. Вероятность, что выбрана «слабая» кривая, всегда остается.

Задача решения дискретного логарифма может быть решена теоретически; надежность базируется на сложности факторизации N; числа N, g, k известны всем.

Обратить особое внимание на

Случайное число k, генерируемое клиентом в процессе подписи, не должно использоваться дважды!

Числа A, B не должны быть равны 0 и 0, –vk соответственно.

Защита от пассивного MitM

да (но только не в момент регистрации)

да

да

Защита от активного MitM

да (только, если учетные данные не компрометированы)

да

да

Защита пароля при компрометации БД

да

да

да

Защита после компрометации БД и прослушивании канала

нет

да

да

Препятствие «легальному» доступу злоумышленника после компрометации БД

да

да

да

Взаимная аутентификация сторон

нет

нет

да

Защита от фишинга (попытка злоумышленника выдать себя за легальный сервер)

нет

нет

да

Требует наличие какого-либо доп. защищенного канала при регистрации клиента?

да

нет

нет

Защита слабых паролей в момент авторизации

нет

да

да

Защита от владельцев ЦОД

нет

нет

нет

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 4,00 из 5)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector