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

Комментарии 68

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

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

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

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

вообще-то ß — вполне себе маленькая. В заглавном варианте заменялась на SS: gruß → GRUSS. И в 2017 ввели заглавную ẞ. https://en.wikipedia.org/wiki/ß

Тем не менее пхп счиатет её и маленькой и большой

А в какой версии PHP проверяли ? Или не зависит ?

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

Спустя некоторое время додумался, что вы всё же правы. Я дурачок, который забыл mb_*. Однако, даже с ним реультаты оказались немного шокирующими, поэтому под корень выпиливать абзац не стал. Тем не менее, спасибо за то, что обратили внимание!

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

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

мелком форуме

Каждый мелкий форум считает себя большим и важным ;)

Плох тот солдат форум, который не мечтает стать генералом Хабром ;)

public static function isStrongPassword(
  string $password,
  string $login,
  string $email
): bool {
  return strLength($password) >= self::PASSWORD_MIN_LEN
    && !preg_match('/^\d+$/', $password)
    && stripos($password, $login) === false
    && stripos($password, $email) === false;
}

Я в своих проектах давным-давно запилил такую проверку и не парюсь

Ну когда вы пишите коммерческий софт, то вам будут прилетать требования сложности пароля. Мы с ребятами пока думаем, чтобы простынку из настроек "кол-во маленьких букв, кол-во больших букв" превратить в скроллер парольной энтропии. Правда и тут встаёт затык с правильным подсчётом энтропии в либах - попробуйте прочекать пароли типа "passwordpassword" и "ааааааааааааа" в таких энтропийных калькуляторах - они вас разочаруют.

Это какие, аналогично всем вот этим онлайн по Шеннону которые гуглятся? Тогда гляньте как это например в кипасе сделано. Но готовую либу не подскажу, просто вспомнилось что там всё норм с подсчётом.

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

Ради интереса, если еще не видели, посмотрите на подход к примеру у zxcvbn (демо).

Так может заходить с другой стороны: придумывать пароль самим и показывать/высылать пользователю?

Заодно проблема утечки пароля при взломе других сайтов отпадёт.

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

генерировать его для потребителя это дыра в безопасности размером с Москву

Обоснуйте, пожалуйста. Напомню две вещи: 1) придуманный пользователем пароль передаётся сайту при регистрации 2) в обоих случаях он передаётся сайту при входе.

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

Можно ещё для авторизации использовать сертификаты - кажется единственный вариант, когда сайт не знает секретный ключ пользователя и не полагается на сторонние сервисы.

Или что намного хуже, забудет сразу и потом будет каждый раз использовать "Я забыл пароль."

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

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

Обоснуйте, пожалуйста. Напомню две вещи: 1) придуманный пользователем пароль передаётся сайту при регистрации 2) в обоих случаях он передаётся сайту при входе.

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

Хоть и пароль передается сайту, то нормальные сайты этот пароль будут использовать только для необходимых действий по аутентификации потребителя и будут сразу забывать.


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


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


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

Если вы сделаете сайт который будет всегда генерировать пароли и не будет давать возможность сменить, то доверие в таком сайте будет подорвано сразу и безвозвратно. (И правильно)

И неправильно, абсолютно.

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

2) С какой стати вы утверждаете, что сайтам дающим ввести десятки раз утёкший пароль стоит доверять? Если уж заходить со стороны параноидальной безопастности, то именно им нельзя верить ни на грамм — они могут «проверить» куда ещё подходят выбранные тобой логин и пароль. Собственно, часть фишинговых сайтов именно это и делают.

Но там всегда есть совет заменить пароль сразу после первого захода. 

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

Есть три варианта:

А) Показать пароль пользователю один единственный раз. Вообще никаких проблем с точки зрения безопастности — https обломает провайдера и всех прочих «людей посередине».

Б) Отправить пароль по почте. Казалось бы, люди не верят почтовому провайдеру, но при всех остальных опасных операциях (смене пароля или даже почты) эти же люди почтовому провайдеру безоговорочно верят. «Здесь верю, тут не верю» приводит к довольно глупому результату.

В) Сайты которые позволяет увидеть созданный пароль в любое время, например, пароль к админке сайта/VPS у хостера. Но тут проблема не в генерации пароля, а в его хранении в открытом виде. При этом смена пароля это лишь костыль, а правильное решение к которому все идут — вход в VPS по сертификатам и полное отключение доступа по паролю.

эти же люди почтовому провайдеру безоговорочно верят.

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


Сайты которые позволяет увидеть созданный пароль в любое время, например, пароль к админке сайта/VPS у хостера.

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


Кстати, на моих VPS я всегда устанавливаю свой дистрибутив Linux, на всякий случай.

Спасибо за вывод в конце. Осталось убедить в этом всех остальных... В конце концов пароль вида "Сорок тысяч обезьян в попу сунули банан" гораздо более устойчив чем "pA$s(W0rD)&С" (и да, "С" тут кириллическая... И такой пароль куча систем проверок пароля вообще не примут - из-за скобок ли, кириллицы ли или ещё чего).

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

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

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

В конце концов, безопасность пользователя – это дело пользователя.

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

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

нужно чтобы он придумал себе нормальный пароль, который не подберётся за три раза

Откуда пользователь может знать, за сколько раз подберется его пароль?

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

И вы очень сильно заблуждаетесь

… либо взломали сайт, в БД которого и хранился пароль. У меня так несколько хороших паролей утекло, и единственное, что в этом случае спасло — настроенная двухфакторка

Наша же задача ... обеспечить безопасность ... хранения (хотя бы захэшировать с солью)

На каждом сайте должен быть свой пароль. Иначе пропадает смысл в паролях.

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

Тогда его только Господь Бог остановит. Или смерть. Какой выбирать себе пароль -- дело пользователя. Захочет -- придумет себе пароль, как последняя моя регулярка со словарём спецсимволов. Такое хрен отгадаешь. Захочет -- "послал дед бабку к морю ловить рыбу", захочет -- кверти. Если кверти -- пользователь сам себе враг, и конкретный сайт тут не виноват.

Эти "три попытки на капчу" никак не помогут взламывать утёкшую базу.

Да и как пользоватедю понять сколько попыток надо для взлома его пароля? Его задача "побыстрее пройти регистрацию", а не решать проблемы безопасности какого-то непонятного сайта.

От утекшей базы мы как бэкендеры можем озаботиться только защитой системы и, господи, в который раз: кто вообще хранит пароль не в виде хэша?

При чём тут хеш? Сейчас почти все утекшие базы имеют пароли в виде хеша. Но если пароль словарный, то наличие хеша -- это почти то же самое, что и пароль в чистом виде. Особенно если учесть, что вроде как почти все знают про хеш, но почему-то не все его солят. Это достаточно распространено на разных сайтах (друг рассказал).

У чат ЖПТ факты лучше не спрашивать. Он соврет и не покраснеет

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

Химикам вообще просто, в качестве пароля можно использовать формулу реакции.

Если формула не самая известная, то никакой словарь не поможет.

Например: [RO-P(O)2-O-P(O)2-O-PO3]4− + H2O->[RO-P(O)2-O-PO3]3− + [HPO4]2− + H+

Это вынуждает использовать очень маленькое количество паролей в мире где сервисов сотни, так что менеджер паролей must have

Главное, на хранить их в гугле :D

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

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

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

123456

Если вы хотите чтобы у ваших пользователей были надежные пароли — сгенерируйте их сами, а если пользователь захочет сменить пароль — предложите ему на выбор 3-5 вариантов вновь сгенерированных.
А если давать вводить пароль самому, то зачем действительно ограничивать человека.

Правильный ответ, прозвучит грубо, отвалите от пользователей. Все Ваши выпердиши это потому что не даёте пользователю решать каким должен быть пароль, то добавьте Большие, то нету цифр, то спецсимволы не там, он пароль слишком длинный... Отстаньте! Все нормализуется со временем, да будут дураки, но как будто дураки не страдают даже с супер надежными паролями? :) Извините накипело.

Все таки правильный ответ дайте вход через ВК, Гугл или что либо еще. 99 сервисов вообще не нужно иметь своих регистраций

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

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

Рекомендую автору для изучения функцию preg_quote

пасиб

За конечный вывод – Браво! Именно так и никак иначе!


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

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

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

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


То есть, вводя правила, вы всегда уменьшаете безопасность системы. Больше и сложнее правил – меньше безопасности в системе.

Если не вводить правил, то половина паролей будет "qwerty", а вторая половина — "12345". Как это не уменьшит безопасность системы — загадка.

Даже если это и так, то это значит что для пользователей безопасность не важна. Надо сделать так, чтобы была важна.


Кстати, единственный метод контроля за паролями, который реально повышает безопасность, это просто брутфорсить пароли пользователей (конечно со словарем) и если брутфорсятся быстро (ну, не знаю, примерно за неделю), то требовать смену. Так рано или поздно, все пользователи придумают хорошие пароли.


ЕДИТ: Кстати, с правилами все пароли будут "Qwe!@34" что выглядит получше, но по сути то же самое.

Почему бы не ограничиться просто латиницей (без регистра), + несколькими пунктуациями (точка, запятая, точка с запятой, !, ?).
Ну и требование к размеру пароля - пусть лучше +10-40 символов длины, чем +30 разных условий на спецы/эмодзи/регистр и т.д.

Объективно - даже в кириллице, буква ё/й может быть как одним символом, так и двумя (е с диересизом). Причём это не всегда доступно для контроля пользователем (винда/линукс/мак - одни и те же клавиши нажаты; одно и то же на экране отобразилось, РАЗНОЕ в файл записалось).
(если что - вот я сейчас с мака это набираю. И файлы на сетевой шаре с "одинаковыми именами" я уже наблюдал. В именах были ё/й)

:D

Ну, не сомневаясь в верности самого комикса, все таки надо сделать 3 замечания:


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


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


  3. А как, если у нас не один пароль а десятки (сотни)? Смешались в кучу кони, люди, и батарейки с степлерами.


В одной из итераций моих паролей у меня был плюс-минус один пароль на несколько сервисов. Скажем, для простоты, "%1$s %2$s %3$s %4$s", но %3$s заменялся на название сервиса. Типа twitter, vk, fb и тд.

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

Ну да, знакомо, знакомо. Я тоже через такое проходил.


А потом, наконец, завел менеджер паролей и теперь у меня только один очень сильный случайный пароль, а все остальные генерирует KeePassXC. Храню на локальном диске, синхронизирую через SSH.

ЧадГБТ может проверить сложность пароля?

Сисадмин желал подобрать себе стойкий пароль для централизованной авторизации через radius-сервер. Он обратился за советом к Инь Фу Во.

– Как вы думаете, Учитель, пароль «史達林格勒戰役» стойкий?

Нет, – ответил мастер Инь, – это словарный пароль.

– Но такого слова нет в словарях…

– "Словарный" означает, что это сочетание символов есть в wordlists, то есть "словарях" для перебора, которые подключаются к программам криптоанализа. Эти словари составляются из всех сочетаний символов, которые когда-либо встречались в Сети.

– А пароль «Pft,bcm» подойдёт?

– Вряд ли. Он тоже словарный.

– Но как же? Это же…

– Введи это сочетание в Гугле – и сам увидишь.

Сисадмин защёлкал клавишами.

– О, да. Вы правы, Учитель.

Через некоторое время Сисадмин воскликнул:

– Учитель, я подобрал хороший пароль, которого не может быть в словарях.

Инь Фу Во кивнул.

– Я ввёл его в Гугле, – продолжал Сисадмин, – и убедился, что в Сети такого сочетания нет.

– Теперь есть.

Перестаньте использовать пароли. Это решает все проблемы, описанные в посте (и ещё некоторые).

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории