Как вы, наверное, знаете, хакеры есть везде, и они хотят взломать все. Вас попросили сделать требования паролю, которые остановят любого хакера . Проблема в том, что ваш начальник слышал, что платить за LOC - это зло, и он платит вам $ 1800 - $ 0,03 * символов, вставляемых в месяц, чтобы вы написали простейшую вещь, которая могла бы сработать. Таким образом, вы должны использовать небольшое количество символов (надеюсь, очень маленькие), или иначе забыть о деньгах. Кроме того, вашему боссу все равно, на каком языке вы будете пользоваться.
Требования к надежным паролям аналогичны требованиям в упомянутой статье, за исключением того, что требования на основе словаря были удалены, чтобы избежать зависимости решения от внешних файлов, вам не нужно проверять перестановку букв (трудно понять, что это на самом деле означает), последнее правило удалено (что такое 3/4?) и оно не проверяет старые пароли.
Точные требования после удаления определенных требований из связанной статьи:
- иметь не менее 8 символов!
- не длиннее 12 символов!
- иметь заглавные и строчные буквы!
- не более 8 заглавных букв!
- иметь не более 8 строчных букв!
- иметь как минимум 2 буквы!
- есть ведущее письмо!
- иметь как минимум 1 цифру (ы)!
- не быть вашим именем пользователя!
- не быть вашим именем пользователя задом наперед!
- не содержать ваше имя пользователя!
- не содержать ваше имя пользователя в обратном направлении!
- иметь не более 1 пары повторяющихся символов!
- не имеют 3 вхождений одного и того же персонажа!
- не содержит карат (^)
- не содержит места
- не содержит =
- не conatain &
- не содержит #
- не содержать,
- не согласен ;
- не содержат "
- не содержит>
- не содержит <
- не содержит [
- не содержат |
- не содержать)
Все орфографические ошибки в этом списке остались без изменений.
$ ./checkpass
Username: John
Password: L!]E2m69
OK.
$ ./checkpass
Username: John
Password: JohnnhoJ12
Nope.
$ ./checkpass
Username: JOE.smith
Password: JOE!smith123
OK.
Самый короткий код выигрывает деньги (отправляется в виде файла JPG). Он должен отображать приглашения «Имя пользователя» и «Пароль:» и отвечать точным сообщением.
1
(цифра один) вместо ell.Ответы:
Perl,
203194189193 символовВот мой Perl берет на себя проблему:
Регулярные выражения проверяют, чтобы пароль:
начинается с буквы, имеет от восьми до двенадцати символов
содержит цифру
содержит заглавную букву
имеет восемь или меньше заглавных букв
имеет восемь или меньше строчных букв
содержит строчную букву
не содержит ни одного из запрещенных знаков препинания, трех вхождений любого символа, более одного вхождения двойного символа, имени пользователя или обратного имени пользователя.
(Спасибо Питеру Тейлору за то, что он указал на ошибку в версии с 189 символами.)
источник
use v5.10;
и он не прошел мой тестовый сценарий "Правильно ли заданы регулярные выражения". См. Ideone.com/QKFnZ\Q$u\E|\Q$n
(последнее\E
можно пропустить, если эта часть будет перемещена в конец).(.)(.*\1.*\1|\1.*(.)\3)
(не проверено - я не собираюсь пытаться написать сценарий полного теста батареи с ideone).Рубин, 270 знаков
Реализация ruby основана на двенадцати регулярных выражениях. Каждое выражение является либо положительным совпадением (первые пять), либо отрицательным (последние семь). В качестве ограничения имя пользователя может содержать только буквы или цифры.
Положительные совпадения регулярного выражения:
/^.{8,12}$/
: иметь не менее 8 символов! не длиннее 12 символов!/\p{Lower}/
и/\p{Upper}/
: иметь заглавные и строчные буквы!/^(\p{Alpha}.*){2}/
: иметь по крайней мере 2 буквы, иметь начальную букву!/\d/
: иметь хотя бы 1 цифру (ы)!Отрицательные совпадения с регулярным выражением:
/(\p{Lower}.*){9}/
: иметь не более 8 строчных букв!/(\p{Upper}.*){9}/
: иметь не более 8 заглавных букв!/(.)\1.*(.)\2/
: иметь не более 1 пары повторяющихся символов!/(.).*\1.*\1/
: не иметь 3 вхождения одного и того же персонажа!/[ ^=&#,;"<>\[|)]/
: не содержит каретки, пробела, =, &, #, ,,;, ",>, <, [, |,)/#{u}/
: не быть вашим именем пользователя! не содержать ваше имя пользователя!/#{u.reverse}/
: не быть вашим именем пользователя в обратном направлении !, не содержать ваше имя в обратном направлении!источник
Python 3, 291 байт / символы
Более красиво отформатирован и прокомментирован:
Вы можете найти это решение на ideone.com , но вывод выглядит немного уродливо, потому что он не показывает предопределенный ввод или даже разрывы строк. Также комбинация логин-пароль
"JOE.smith"
-"JOE!smith123"
в данный момент вводится как фиксированные входные данные.Я добавил разбивку всех проверок в качестве отладочного вывода, хотя.
источник