Мы уже проверяем случай password = username, но я не очень люблю проверки на подстроку, особенно для коротких имён пользователей. Что, если ваше имя пользователя — «Ed», а пароль — случайная строка, которая случайно содержит «ed»..
Использовать метрику сходства, например, расстояние Левенштейна (Levenshtein distance), и отклонять запрос, если levenshtein(username, password) < 6? Или даже добавить проверку на перестановки, например:
Кажется, это покроет самые грубые нарушения, не запрещая пользователю с именем «Ed» зарегистрироваться с длинным и надёжным паролем. К тому же это легко объяснить: «имя пользователя и пароль слишком похожи». Я не искал нежелательные крайние случаи, но в данный момент не могу придумать ни одного.
Обратная сторона «всё более и более» строгих правил заключается в том, что подбор паролей методом грубой силы становится проще.
Очевидно, что в пароле длиной 15 символов или меньше буква z не должна повторяться 10 раз.
Очевидно, что слово password не должно встречаться в пароле, если его длина меньше 12 символов.
Два слова из словаря подряд — это явно неправильно…
И так далее. Таким образом, пространство для перебора паролей сокращается.
Это кроличья нора: после размышлений я изменил своё мнение относительно вчерашнего. Я согласен с @codinghorror: я не думаю, что нам нужно что-то делать в данном случае.
«Сложно создать хорошие правила, поэтому мы не должны создавать правила»?
Это уже второй раз за два дня, когда я вижу, что высокопоставленные члены команды Discourse распространяют серьёзные заблуждения о безопасности. Мне кажется, есть несколько общих моментов, которые вам стоит пересмотреть, и я надеюсь, что вы воспримете это как конструктивную критику.
Кроме того, это конкретное предложение возникло не на пустом месте: недавно у нас был взломан аккаунт пользователя, потому что имя пользователя было myusername, а пароль имел вид myusername46.
Конечно, это был сайт ClassicPress (та же структура входа, что и в WordPress), поэтому он гораздо более «лёгкая добыча» для ботов и т. п. Однако именно такие пароли ищут боты.
Правила паролей не могут предотвратить все виды слабых паролей, но они могут значительно помочь.
Технически мы следуем руководящим принципам NIST 800-63-B:
При обработке запросов на создание и изменение запоминаемых секретов верификаторы ДОЛЖНЫ сравнивать предполагаемые секреты со списком, содержащим значения, которые, как известно, часто используются, ожидаемы или скомпрометированы. Например, этот список МОЖЕТ включать, но не ограничивается:
Пароли, полученные из предыдущих корпусов утечек данных.
Слова из словаря.
Повторяющиеся или последовательные символы (например, «aaaaaa», «1234abcd»).
Контекстно-зависимые слова, такие как название сервиса, имя пользователя и их производные.
В документе явно используется слово МОЖЕТ, а не ДОЛЖНО. Следовательно, это остаётся на наше усмотрение. Здесь нет рекомендации по расстоянию Левенштейна. Возможно, стоит добавить правило: «если имя пользователя длиннее 6 символов, оно не должно входить в пароль», либо реализовать проверку энтропии поверх списка из миллиона паролей. Не знаю точно.
Я полагаю, если вы крайне заинтересованы в собственных правилах, вы можете развернуть SSO и установить любые правила на своей стороне. Либо написать плагин.
Вероятно, именно это мы и сделаем. Здесь ещё многое отсутствует, но пока что ответы не дают повода считать, что поднимать эту тему особенно целесообразно.
Пожалуйста, поделитесь созданным вами плагином с сообществом здесь, в категории #plugin. Не все согласны с каждым нашим решением, и я полностью уважаю разнообразие мнений и вариантов. Возможно, кому-то будут интересны более строгие правила паролей.