Окончательное руководство по аутентификации веб-сайта на основе форм

Аутентификация на основе форм для веб-сайтов

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

Он должен включать такие темы, как:

  • Как войти в систему
  • Как выйти из системы
  • Как оставаться в системе
  • Управление файлами cookie (включая рекомендуемые настройки)
  • Шифрование SSL / HTTPS
  • Как хранить пароли
  • Использование секретных вопросов
  • Забыли имя пользователя / пароль
  • Использование nonces для предотвращения подделок подделок (CSRF)
  • OpenID
  • «Запомнить меня»
  • Автозаполнение браузером имен пользователей и паролей
  • Секретные URL-адреса (общий URL-адрес, защищенный дайджестом)
  • Проверка силы пароля
  • Проверка электронной почты
  • и многое другое об аутентификации на основе форм …

Он не должен включать такие вещи, как:

Пожалуйста, помогите нам:

  1. Предложить подтемы
  2. Предоставление хороших статей об этой теме
  3. Редактирование официального ответа

ЧАСТЬ I: Как войти

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

К HTTPS или не к HTTPS?

Если соединение уже безопасно (т. Е. Туннелировано через HTTPS с использованием SSL / TLS), ваши значения формы входа будут отправляться в виде открытого текста, что позволяет любому, кто перехватывает строку между браузером и веб-сервером, сможет читать логины по мере их прохождения через. Этот тип прослушивания регулярно выполняется правительствами, но в целом мы не будем рассматривать «принадлежащие» провода, кроме как сказать это: если вы защищаете что-либо важное, используйте HTTPS.

По сути, единственный практический способ защиты от прослушивания / пакетного обнюхивания во время входа в систему – использование HTTPS или другой схемы шифрования на основе сертификатов (например, TLS ) или проверенной и проверенной схемы ответа на вызов (например, Diffie-Hellman основанный на SRP). Любой другой метод может быть легко обойден злоумышленником.

Конечно, если вы хотите немного непрактично, вы также можете использовать некоторую форму двухфакторной схемы аутентификации (например, приложение Google Authenticator, физическую кодовую книгу типа «холодная война» или ключ ключа генератора RSA). При правильном применении это может работать даже с незащищенным соединением, но трудно представить, что разработчик захочет реализовать двухфакторное аутентификацию, а не SSL.

(Do not) Roll-your-own JavaScript-шифрование / хеширование

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

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

Хотя верно, что hashирование пароля может быть эффективным против раскрытия пароля , оно уязвимо для повторных атак, нападений / захватов Man-In-The-Middle (если злоумышленник может ввести несколько байтов на вашу незащищенную HTML-страницу, прежде чем он достигнет вашего браузер, они могут просто прокомментировать hashирование в JavaScript) или атаки с использованием грубой силы (поскольку вы передаете злоумышленнику имя пользователя, соли и hashированного пароля).

CAPTCHAS против человечества

CAPTCHA предназначены для предотвращения одной конкретной категории атаки: автоматическая пробная версия с ошибкой словаря / грубой силы без оператора. Нет никаких сомнений в том, что это реальная угроза, однако есть способы беспрепятственно справляться с этим, не требуя CAPTCHA, специально разработанных схем управления доступом к серверным сайтам – мы обсудим их позже.

Знайте, что реализации CAPTCHA не созданы одинаково; они часто не разрешаются людьми, большинство из них фактически неэффективны против ботов, все они неэффективны против дешевого труда третьего мира (согласно OWASP , текущая ставка покера составляет 12 долларов США на 500 тестов), а некоторые реализации могут быть технически незаконным в некоторых странах (см. OwASP Authentication Cheat Sheet ). Если вы должны использовать CAPTCHA, используйте reCAPTCHA от Google, так как по определению это OCR-hard по определению (поскольку он использует уже распознанные OCR-расclassифицированные сканирование книг) и очень сложно быть удобным для пользователя.

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

Хранение паролей / проверка логинов

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

Поэтому, если вы не можете сохранить пароль, как вы проверяете правильность комбинации паролей входа и пароля POSTed из формы входа? Ответ – хеширование с помощью функции деривации ключа . Всякий раз, когда создается новый пользователь или изменяется пароль, вы берете пароль и запускаете его через KDF, например, Argon2, bcrypt, scrypt или PBKDF2, превращая пароль cleartext («correcthorsebatterystaple») в длинную строку в случайном порядке , что намного безопаснее хранить в вашей базе данных. Чтобы проверить логин, вы запускаете ту же функцию хеша на введенном пароле, на этот раз передавая соль и сравнивая полученную строку хеша с значением, хранящимся в вашей базе данных. Argon2, bcrypt и scrypt уже хранят соль с хешем. Для получения более подробной информации ознакомьтесь с этой статьей на sec.stackexchange.

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

Криптографический хеш не должен использоваться для хранения паролей, поскольку пользовательские пароли недостаточно сильны (т. Е. Обычно не содержат достаточной энтропии), и атака с угадыванием пароля может быть завершена в течение относительно короткого времени злоумышленником с доступом к hashам. Вот почему используется KDF – они эффективно «растягивают ключ», что означает, что каждый пароль, который устраивает атакующий, включает в себя повторение алгоритма хеширования несколько раз, например, 10000 раз, что делает пароль атакующего более 10 000 раз медленнее.

Данные сеанса – «Вы вошли как Spiderman69»

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

Если вы не знакомы с данными сеанса, вот как это работает: единая произвольно сгенерированная строка хранится в истечении срока действия cookie и используется для ссылки на dataset – данные сеанса, которые хранятся на сервере. Если вы используете структуру MVC, это, без сомнения, уже обрабатывается.

Если это вообще возможно, убедитесь, что cookie сеанса имеет безопасные и только HTTP-флаги, установленные при отправке в браузер. Флаг httponly обеспечивает некоторую защиту от того, что cookie читается атакой XSS. Безопасный флаг гарантирует, что cookie отправляется только через HTTPS, и, следовательно, защищает от сетевых обнюхивающих атак. Значение cookie не должно быть предсказуемым. Если представлен файл cookie, ссылающийся на несуществующий сеанс, его значение следует немедленно заменить, чтобы предотвратить фиксацию сеанса .

ЧАСТЬ II: Как Остаться Записанным – Позорный «Помни меня» Флажок

Постоянная регистрация файлов cookie («запомнить меня») – опасная зона; с одной стороны, они полностью безопасны, как обычные логины, когда пользователи понимают, как их обрабатывать; и, с другой стороны, они представляют собой огромный риск для безопасности в armх небрежных пользователей, которые могут использовать их на общедоступных компьютерах и забывать выйти из системы, а также могут не знать, какие cookies браузера и как их удалить.

Лично мне нравятся постоянные логины для веб-сайтов, которые я посещаю регулярно, но я знаю, как их безопасно обрабатывать. Если вы уверены, что ваши пользователи знают то же самое, вы можете использовать постоянные логины с чистой совестью. Если нет – хорошо, тогда вы можете подписаться на философию, согласно которой пользователи, которые небрежно относятся к своим учетным данным, принесли на себя, если они будут взломаны. Это не то, что мы идем к домам наших пользователей и отрываем все эти заметки Post-It, вызывающие facepalm, с паролями, которые они выстроили на краю своих мониторов.

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

Если вы решите внедрить постоянные cookies для входа в систему, вот как вы это делаете:

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

  2. И просто для того, чтобы повторить одну из самых распространенных ловушек, НЕ ЗАПУСКАЙТЕ СТОЙНУЮ КОРИЧНЕВНУЮ ЛОЖЬ (ТОКЕН) В ВАШЕЙ БАЗЕ ДАННЫХ, ТОЛЬКО ХАШ ЭТО! Маркер входа – это эквивалент паролей, поэтому, если злоумышленник получил доступ к вашей базе данных, они могут использовать токены для входа в любую учетную запись, точно так же, как если бы они были комбинациями паролей и паролей cleartext. Поэтому используйте хеширование (в соответствии с https://security.stackexchange.com/a/63438/5002 слабый хеш будет отлично подходит для этой цели) при хранении постоянных токенов входа.

ЧАСТЬ III: Использование секретных вопросов

Не выполняйте «секретные вопросы» . Функция секретных вопросов – это анти-шаблон безопасности. Прочитайте документ из номера ссылки 4 из списка MUST-READ. Вы можете спросить у Сары Пэйлин об этом, после ее Yahoo! электронная почта была взломана во время предыдущей президентской кампании, потому что ответ на ее вопрос безопасности был … «Высшая школа Wasilla»!

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

  • «Стандартный» секретный вопрос, как девичья фамилия матери или любимое домашнее животное

  • Простая мелочь, которую любой мог снять со своего блога, профиль LinkedIn или аналогичный

  • Любой вопрос, который легче ответить, чем угадать их пароль. Который для любого достойного пароля – это каждый вопрос, который вы можете себе представить

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

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

ЧАСТЬ IV: Функциональность забытых паролей

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

  1. Не переустанавливайте забытый пароль на автогенерированный надежный пароль – такие пароли, как известно, трудно запомнить, а это означает, что пользователь должен либо изменить его, либо записать его – скажем, на ярко-желтый пост-он на краю монитора. Вместо того, чтобы устанавливать новый пароль, просто дайте пользователям сразу выбрать новый, что и в любом случае. (Исключением может быть, если пользователи универсально используют диспетчер паролей для хранения / управления паролями, которые, как правило, невозможно запомнить, не записывая их).

  2. Всегда hash-код потерянного пароля / токена в базе данных. СНОВА , этот код является еще одним примером эквивалента пароля, поэтому он ДОЛЖЕН быть hashирован, если злоумышленник получил доступ к вашей базе данных. Когда запрашивается код потерянного пароля, отправьте код открытого текста на адрес электронной почты пользователя, затем запишите его, сохраните hash в своей базе данных и выбросьте оригинал . Также как пароль или постоянный токен входа.

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

ЧАСТЬ V: Проверка силы пароля

Во-первых, вы захотите прочитать эту небольшую статью для проверки реальности: 500 наиболее распространенных паролей

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

Итак: без минимальных требований к надежности пароля 2% пользователей используют один из 20 наиболее распространенных паролей. Значение: если злоумышленник получает всего 20 попыток, 1 из 50 учетных записей на вашем сайте будет взломан.

Для этого необходимо вычислить энтропию пароля и затем применить порог. Специальная публикация «Национальный институт стандартов и технологий» (NIST) 800-63 содержит множество замечательных предложений. Это, в сочетании с анализом макета словаря и клавиатуры (например, «qwertyuiop» – это плохой пароль), может отклонить 99% всех слабо отобранных паролей на уровне 18 бит энтропии. Простое вычисление силы пароля и отображение визуального измерителя силы для пользователя – это хорошо, но недостаточно. Если это не будет соблюдено, многие пользователи, скорее всего, не обратят на него внимания.

И для освежающего подхода к удобству использования паролей с высокой энтропией настоятельно рекомендуется использовать прокси-сервер Randall Munroe xkcd .

ЧАСТЬ VI: Гораздо больше – или: Предотrotation попыток входа в систему быстрого доступа

Во-первых, посмотрите на цифры: скорость восстановления пароля – как долго ваш пароль будет стоять

Если у вас нет времени, чтобы просмотреть таблицы в этой ссылке, вот список из них:

  1. Потребуется практически не время взломать слабый пароль, даже если вы взламываете его счетчиками

  2. Для того, чтобы взломать буквенно-цифровой 9-значный пароль, практически нет времени , если он нечувствителен к регистру

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

  4. Однако потребовалось бы слишком много времени для взлома даже 6-символьного пароля, если бы вы были ограничены одной попыткой в ​​секунду!

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

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

  • Представьте CAPTCHA после неудачных попыток N (раздражает, как ад и часто неэффективно, но я повторяюсь здесь)

  • Блокировка учетных записей и проверка электронной почты после неудачных попыток N (это ждет DoS- атака)

  • И, наконец, регулирование входа в систему : то есть установка временной задержки между попытками после неудачных попыток N (да, атаки DoS все еще возможны, но по крайней мере они гораздо менее вероятны и намного сложнее выйти).

Лучшая практика №1: короткая временная задержка, которая увеличивается с количеством неудачных попыток, например:

  • 1 неудачная попытка = без задержки
  • 2 неудачных попытки = 2 с задержки
  • 3 неудачных попытки = 4 с задержка
  • 4 неудачных попытки = задержка 8 сек.
  • 5 неудачных попыток = задержка 16 с
  • и т.п.

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

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

Лучшая практика № 2: временная задержка средней длины, которая вступает в силу после неудачных попыток N, таких как:

  • 1-4 неудачных попытки = без задержки
  • 5 неудачных попыток = 15-30 минут задержки

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

Лучшая практика № 3: объединение двух подходов – либо фиксированная, короткая временная задержка, которая вступает в силу после неудачных попыток N, таких как:

  • 1-4 неудачных попытки = без задержки
  • 5+ неудачных попыток = задержка 20 секунд

Или увеличение задержки с фиксированной верхней границей, например:

  • 1 неудачная попытка = 5 секунд задержки
  • 2 неудачных попытки = 15 секунд задержки
  • 3+ неудачные попытки = 45 секунд задержки

Эта окончательная схема была взята из предложений наилучшей практики OWASP (ссылка 1 из списка MUST-READ) и должна считаться лучшей практикой, даже если она, по общему признанию, является ограничивающей стороной.

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

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

Кроме того, имеет смысл делать более агрессивное дросселирование учетных записей администратора, поскольку это наиболее привлекательные точки входа

ЧАСТЬ VII: Распространенные атаки на грубые силы

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

  • Распространение попыток на ботнете для предотвращения помех IP-адреса

  • Вместо того, чтобы выбирать одного пользователя и пытаться использовать 50 000 наиболее распространенных паролей (которые они не могут, из-за нашего дросселирования), они выберут самый общий пароль и попробуют его вместо 50.000 пользователей. Таким образом, они не только преодолевают максимальные попытки, такие как CAPTCHA и дросселирование входа, их шансы на успех также возрастают, так как наиболее распространенный пароль номер 1 гораздо более вероятен, чем номер 49.995

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

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

Слишком абстрактно? Позвольте мне перефразировать:

Скажем, за последние 3 месяца на вашем сайте было в среднем 120 плохих логинов в день. Используя это (среднее значение), ваша система может установить глобальный предел в 3 раза – т.е. 360 неудачных попыток в течение 24-часового периода. Затем, если общее количество неудачных попыток на всех учетных записях превышает этот номер за один день (или даже лучше, следить за скоростью ускорения и триггером на расчетном пороге), он активирует системное регулирование входа в систему – это означает короткие задержки для всех пользователей (все же, за исключением файлов cookie и / или резервного копирования CAPTCHA).

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

ЧАСТЬ VIII. Двухфакторная аутентификация и аутентификация.

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

Аутентификация может быть полностью делегирована службе единого входа, где другой поставщик обрабатывает учетные данные. Это подталкивает проблему к доверенной третьей стороне. Google и Twitter предоставляют сервисы единого входа на основе стандартов, в то время как Facebook предоставляет аналогичное проприетарное решение.

ДОЛЖЕН ПРОЧИТАТЬ ССЫЛКИ О веб-аутентификации

  1. Руководство OWASP для аутентификации / OWASP-аутентификация
  2. Dos и Don’ts проверки подлинности клиента в Интернете (очень читаемый исследовательский документ MIT)
  3. Википедия: HTTP cookie
  4. Вопросы личного знания для проверки подлинности: вопросы безопасности в эпоху Facebook (очень читаемая исследовательская работа в Беркли)

Окончательная статья

Отправка учетных данных

Единственный практичный способ безопасного доступа к учетным данным на 100% – это использование SSL . Использование JavaScript для хеширования пароля небезопасно. Общие ошибки для hashирования пароля на стороне клиента:

  • Если соединение между клиентом и сервером не зашифровано, все, что вы делаете, уязвимо для атак типа «человек-в-середине» . Злоумышленник может заменить входящий javascript, чтобы разорвать hashирование или отправить все учетные данные на свой сервер, они могут прослушивать ответы клиентов и отлично олицетворять пользователей и т. Д. И т. Д. SSL с доверенными полномочными органами сертификации предназначен для предотвращения атак MitM.
  • Хешированный пароль, полученный сервером, менее безопасен, если вы не выполняете дополнительную, избыточную работу на сервере.

Существует еще один безопасный метод, называемый SRP , но он запатентован (хотя он свободно лицензируется ), и имеется мало хороших реализаций.

Хранение паролей

Никогда не храните пароли в виде открытого текста в базе данных. Даже если вы не заботитесь о безопасности своего сайта. Предположим, что некоторые из ваших пользователей повторно используют пароль своего банковского счета в Интернете. Итак, сохраните хешированный пароль и выбросьте оригинал. И убедитесь, что пароль не отображается в журналах доступа или журналах приложений. OWASP рекомендует использовать Argon2 в качестве вашего первого выбора для новых приложений. Если это не доступно, вместо этого следует использовать PBKDF2 или scrypt. И, наконец, если ни одно из перечисленных выше не доступно, используйте bcrypt.

Хеши сами по себе также небезопасны. Например, идентичные пароли означают одинаковые hashи – это делает таблицы поиска hashа эффективным способом взломать много паролей одновременно. Вместо этого сохраните засоленный хеш. Соль – это строка, прикрепленная к паролю до hashирования – используйте различную (случайную) соль для каждого пользователя. Соль является общедоступной, поэтому вы можете хранить их с хешем в базе данных. Подробнее см. Здесь .

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

Вопросы безопасности

Вопросы безопасности небезопасны – избегайте их использования. Зачем? Все, что делает секретный вопрос, пароль делает лучше. Прочтите ЧАСТЬ III: Использование секретных вопросов в @Jens Roland ответьте здесь, в этой вики.

Файлы сеансов

После входа пользователя в систему сервер отправляет пользователю файл cookie сеанса. Сервер может извлекать имя пользователя или идентификатор из файла cookie, но никто другой не может создать такой файл cookie (механизмы объяснения TODO).

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

Если вы хотите автологизировать своих пользователей, вы можете установить постоянный файл cookie, но он должен отличаться от cookie с полной сессией. Вы можете установить дополнительный флаг, который пользователь выполнил автозагрузку, и ему необходимо войти в систему для реальных операций. Это популярно у торговых центров, которые хотят предоставить вам беспрепятственный, персонализированный опыт покупок, но по-прежнему защищают ваши финансовые данные. Например, когда вы возвращаетесь, чтобы посетить Amazon, они показывают вам страницу, похожую на то, что вы вошли в систему, но когда вы идете разместить заказ (или изменить свой адрес доставки, кредитную карту и т. Д.), Они просят вас подтвердить ваш пароль.

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

Список внешних ресурсов

  • Дос и отсутствие аутентификации клиента в Интернете (PDF)
    21 страница академической статьи со многими замечательными советами.
  • Спросите YC: Лучшие практики для аутентификации пользователей
    Обсуждение форума по теме
  • Вероятно, вы храните пароли неправильно
    Вводная статья о хранении паролей
  • Обсуждение: Ужас кодирования: вы, вероятно, храните пароли неверно
    Обсуждение форума о статье о кодировании ужасов.
  • Никогда не храните пароли в базе данных!
    Еще одно предупреждение о сохранении паролей в базе данных.
  • Раскрутка паролей
    Статья в Википедии о слабых сторонах нескольких схем hashирования паролей.
  • Достаточно с таблицами Rainbow: что вам нужно знать о безопасных схемах паролей
    Обсуждение радужных столов и способов защиты от них, а также против других streamов. Включает широкое обсуждение.

Во-первых, сильное предостережение, что этот ответ не подходит для этого точного вопроса. Это определенно не лучший ответ!

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

Я обобщу это так:

  1. Mozilla является некоммерческой организацией со значениями, которые хорошо согласуются с поиском хороших решений этой проблемы.
  2. Сегодня реальность заключается в том, что большинство веб-сайтов используют аутентификацию на основе форм
  3. Аутентификация на основе форм имеет большой недостаток, что увеличивает риск фишинга . Пользователям предлагается ввести конфиденциальную информацию в область, контролируемую удаленным объектом, а не область, контролируемая их User Agent (браузером).
  4. Поскольку браузеры неявно доверяют (вся идея User Agent заключается в том, чтобы действовать от имени Пользователя), они могут помочь улучшить эту ситуацию.
  5. Первичная сила, удерживающая прогресс здесь, – это тупик развертывания . Решения должны быть разложены на этапы, которые обеспечивают некоторую дополнительную выгоду сами по себе.
  6. Самый простой децентрализованный метод выражения личности, встроенный в интернет-инфраструктуру, – это доменное имя.
  7. В качестве второго уровня выражения личности каждый домен управляет собственным набором учетных записей.
  8. Форма «account @ domain» является кратким и поддерживается широким спектром протоколов и схем URI. Такой идентификатор, конечно же, наиболее универсально распознан как адрес электронной почты.
  9. Поставщики электронной почты уже являются фактическими поставщиками первичной идентификации онлайн. Текущие streamи сброса пароля обычно позволяют вам контролировать учетную запись, если вы можете подтвердить, что вы управляете связанным с ней адресом электронной почты.
  10. Протокол Verified Email Protocol был предложен для предоставления защищенного метода на основе криптографии с открытым ключом для оптимизации процесса проверки домена B, что у вас есть учетная запись в домене A.
  11. Для браузеров, которые не поддерживают проверенный протокол электронной почты (в настоящее время все они), Mozilla предоставляет прокладку, которая реализует протокол в клиентском коде JavaScript.
  12. For email services that don’t support the Verified Email Protocol, the protocol allows third parties to act as a trusted intermediary, asserting that they’ve verified a user’s ownership of an account. It is not desirable to have a large number of such third parties; this capability is intended only to allow an upgrade path, and it is much preferred that email services provide these assertions themselves.
  13. Mozilla offers their own service to act as such a trusted third party. Service Providers (that is, Relying Parties) implementing the Verified Email Protocol may choose to trust Mozilla’s assertions or not. Mozilla’s service verifies users’ account ownership using the conventional means of sending an email with a confirmation link.
  14. Service Providers may, of course, offer this protocol as an option in addition to any other method(s) of authentication they might wish to offer.
  15. A big user interface benefit being sought here is the “identity selector”. When a user visits a site and chooses to authenticate, their browser shows them a selection of email addresses (“personal”, “work”, “political activism”, etc.) they may use to identify themselves to the site.
  16. Another big user interface benefit being sought as part of this effort is helping the browser know more about the user’s session – who they’re signed in as currently, primarily – so it may display that in the browser chrome.
  17. Because of the distributed nature of this system, it avoids lock-in to major sites like Facebook, Twitter, Google, etc. Any individual can own their own domain and therefore act as their own identity provider.

This is not strictly “form-based authentication for websites”. But it is an effort to transition from the current norm of form-based authentication to something more secure: browser-supported authentication.

I just thought I’d share this solution that I found to be working just fine.

I call it the Dummy Field (though I haven’t invented this so don’t credit me).

In short: you just have to insert this into your

and check for it to be empty at when validating:

  

The trick is to fool a bot into thinking it has to insert data into a required field, that’s why I named the input “email”. If you already have a field called email that you’re using you should try naming the dummy field something else like “company”, “phone” or “emailaddress”. Just pick something you know you don’t need and what sounds like something people would normally find logical to fill in into a web form. Now hide the input field using CSS or JavaScript/jQuery – whatever fits you best – just don’t set the input type to hidden or else the bot won’t fall for it.

When you are validating the form (either client or server side) check if your dummy field has been filled to determine if it was send by a human or a bot.

Пример:

In case of a human: The user will not see the dummy field (in my case named “email”) and will not attempt to fill it. So the value of the dummy field should still be empty when the form has been send.

In case of a bot: The bot will see a field whose type is text and a name email (or whatever it is you called it) and will logically attempt to fill it with appropriate data. It doesn’t care if you styled the input form with some fancy CSS, web-developers do it all the time. Whatever the value in the dummy field is, we don’t care as long as it’s larger than 0 characters.

I used this method on a guestbook in combination with CAPTCHA , and I haven’t seen a single spam post since. I had used a CAPTCHA-only solution before, but eventually it resulted in about five spam posts every hour. Adding the dummy field in the form has stopped (at least till now) all the spam from appearing.

I believe this can also be used just fine with a login/authentication form.

Warning : Of course this method is not 100% fool proof. Bots can be programmed to ignore input fields with the style display:none applied to it. You also have to think about people who use some form of auto-completion (like most browsers have built-in!) to auto-fill all form fields for them. They might just as well pick up a dummy field.

You can also vary this up a little by leaving the dummy field visible but outside the boundaries of screen, but this is totally up to you.

Be creative!

I do not think the above answer is “wrong” but there are large areas of authentication that are not touched upon (or rather the emphasis is on “how to implement cookie sessions”, not on “what options are available and what are the trade offs”.

My suggested edits / answers are

  • The problem lies more in account setup than in password checking.
  • The use of two factor authenitication is much more secure than more clever means of password encryption
  • Do NOT try to implement your own login form or database storage of passwords, unless the data being stored is valueless at account creation and self-generated (that is, web 2.0 style like Facebook, Flickr , etc.)

    1. Digest Authentication is a standards based approach supported in all major browsers and servers, that will not send a password even over a secure channel.

This avoids any need to have “sessions” or cookies as the browser itself will re-encrypt the communication each time. It is the most “lightweight” development approach.

However, I do not recommend this, except for public, low value services. This is an issue with some of the other answers above – do not try an re-implement server-side authetication mechanisms – this problem has been solved and is supported by most major browsers. Do not use cookies. Do not store anything in your own hand-rolled database. Just ask, per request, if the request is autheticated. Everything else should be supported by configuration and third-party trusted software.

So …

First, we are confusing the initial creation of an account (with a password) with the re-checking of the password subsequently. If I am Flickr and creating your site for the first time, the new user has access to zero value (blank web space). I truly do not care if the person creating the account is lying about their name. If I am creating an account of the hospital intranet / extranet, the value lies in all the medical records, and so I do care about the identity (*) of the account creator.

This is the very very hard part. The only decent solution is a web of trust. For example, you join the hospital as a doctor. You create a web page hosted somewhere with your photo, your passport number and a public key, and hash them all with the private key. You then visit the hospital and the system administrator looks at your passport, sees if the photo matches you, and then hashes the web page / photo hash with the hospital private key. From now on we can securely exchange keys and tokens. As can anyone who trusts the hospital (there is the secret sauce BTW). The system administrator can also give you an RSA dongle or other two-factor authentication.

But this is a lot of hassle, and not very web 2.0. However, it is the only secure way to create new accounts that have access to valuable information that is not self-created.

  1. Kerberos and SPNEGO – single sign on mechanisms with a trusted third party – basically the user verifies against a trusted third party. (NB this is not in any way the not to be trusted OAuth )

  2. SRP – sort of clever password authentication without a trusted third party. But here we are getting into the realms of “it’s safer to use two factor authentication, even if that’s costlier”

  3. SSL client side – give the clients a public key certificate (support in all major browsers – but raises questions over client machine security).

In the end it’s a tradeoff – what is the cost of a security breach vs the cost of implementing more secure approaches. One day, we may see a proper PKI widely accepted and so no more own rolled authentication forms and databases. One day…

When hashing, don’t use fast hash algorithms such as MD5 (many hardware implementations exist). Use something like SHA-512. For passwords, slower hashes are better.

The faster you can create hashes, the faster any brute force checker can work. Slower hashes will therefore slow down brute forcing. A slow hash algorithm will make brute forcing impractical for longer passwords (8 digits +)

A good article about realistic password strength estimation is:

Dropbox Tech Blog » Blog Archive » zxcvbn: realistic password strength estimation

My favourite rule in regards to authentication systems: use passphrases, not passwords. Easy to remember, hard to crack. More info: Coding Horror: Passwords vs. Pass Phrases

I’d like to add one suggestion I’ve used, based on defense in depth. You don’t need to have the same auth&auth system for admins as regular users. You can have a separate login form on a separate url executing separate code for requests that will grant high privileges. This one can make choices that would be a total pain to regular users. One such that I’ve used is to actually scramble the login URL for admin access and email the admin the new URL. Stops any brute force attack right away as your new URL can be arbitrarily difficult (very long random string) but your admin user’s only inconvenience is following a link in their email. The attacker no longer knows where to even POST to.

I dont’t know whether it was best to answer this as an answer or as a comment. I opted for the first option.

Regarding the poing PART IV: Forgotten Password Functionality in the first answer, I would make a point about Timing Attacks.

In the Remember your password forms, an attacker could potentially check a full list of emails and detect which are registered to the system (see link below).

Regarding the Forgotten Password Form, I would add that it is a good idea to equal times between successful and unsucessful queries with some delay function.

https://crypto.stanford.edu/~dabo/papers/webtiming.pdf

I would like to add one very-important comment:

  • “In a corporate, intra- net setting,” most if not all of the foregoing might not apply!

Many corporations deploy “internal use only” websites which are, effectively, “corporate applications” that happen to have been implemented through URLs. These URLs can (supposedly …) only be resolved within “the company’s internal network.” (Which network magically includes all VPN-connected ‘road warriors.’)

When a user is dutifully-connected to the aforesaid network, their identity (“authentication”) is [already …] “conclusively known,” as is their permission (“authorization”) to do certain things … such as … “to access this website.”

This “authentication + authorization” service can be provided by several different technologies, such as LDAP (Microsoft OpenDirectory) , or Kerberos.

From your point-of-view, you simply know this: that anyone who legitimately winds-up at your website must be accompanied by [an environment-variable magically containing …] a “token.” ( ie The absence of such a token must be immediate grounds for 404 Not Found .)

The token’s value makes no sense to you, but, should the need arise, “appropriate means exist” by which your web-site can “[authoritatively] ask someone who knows (LDAP… etc.)” about any and every(!) question that you may have. In other words, you do not avail yourself of any “home-grown logic.” Instead, you inquire of The Authority and implicitly trust its verdict.

Uh huh … it’s quite a mental-switch from the “wild-and-wooly Internet.”

Use OpenID Connect or User-Managed Access .

As nothing is more efficient than not doing it at all.

Давайте будем гением компьютера.