Jak zapewne wiesz, hakerzy są wszędzie i chcą zhakować wszystko. Zostaliśmy poproszeni o określenie wymagań dotyczących hasła, które powstrzymają każdego hakera . Problem polega na tym, że twój szef słyszał, że płacenie za LOC jest złe i płaci ci 1800 $ - 0,03 $ * znaków wstawianych miesięcznie, abyś napisał najprostszą rzecz, która prawdopodobnie mogłaby zadziałać. Musisz więc użyć małej liczby znaków (mam nadzieję, że bardzo mała) lub w inny sposób zapomnieć o gotówce. Ponadto szefowi nie zależy na tym, jakiego języka będziesz używać.
Wymagania dotyczące dobrych haseł są podobne do tych we wspomnianym artykule, z wyjątkiem wymagań opartych na słowniku, aby uniknąć uzależnienia rozwiązania od plików zewnętrznych, nie musisz sprawdzać, czy litery są uporządkowane (Trudno zrozumieć, co to właściwie oznacza), ostatnia reguła została usunięta (Co to jest 3/4?) i nie sprawdza starych haseł.
Dokładne wymagania po usunięciu niektórych wymagań z powiązanego artykułu to:
- mieć co najmniej 8 znaków!
- nie może być dłuższy niż 12 znaków!
- mają wielkie i małe litery!
- mieć nie więcej niż 8 wielkich liter!
- mieć nie więcej niż 8 małych liter!
- mieć co najmniej 2 litery!
- mieć wiodący list!
- mieć co najmniej 1 cyfrę (y)!
- nie być twoją nazwą użytkownika!
- nie być twoją nazwą użytkownika wstecz!
- nie zawiera twojej nazwy użytkownika!
- nie zawierają odwrotnie nazwy użytkownika!
- mieć nie więcej niż 1 parę powtarzających się postaci!
- nie mieć 3 wystąpień tej samej postaci!
- nie zawiera karat (^)
- nie zawiera spacji
- nie zawiera =
- nie conatain &
- nie zawiera #
- nie zawiera ,
- nie conatain ;
- nie zawiera "
- nie zawierają>
- nie zawiera <
- nie zawiera [
- nie zawierają |
- nie zawiera )
Wszystkie błędy pisowni na tej liście pozostały bez zmian.
$ ./checkpass
Username: John
Password: L!]E2m69
OK.
$ ./checkpass
Username: John
Password: JohnnhoJ12
Nope.
$ ./checkpass
Username: JOE.smith
Password: JOE!smith123
OK.
Najkrótszy kod wygrywa pieniądze (wysyłane jako plik JPG). Musi wyświetlać monity „Nazwa użytkownika” i „Hasło:” oraz odpowiadać dokładną wiadomością.
1
(cyfrę pierwszą) zamiast ell.Odpowiedzi:
Perl,
203194189193 znakówOto mój Perl podchodzi do problemu:
Wyrażenia regularne sprawdzają, aby hasło:
zaczyna się na literę, ma osiem do dwunastu znaków
zawiera cyfrę
zawiera wielką literę
ma osiem lub mniej wielkich liter
ma osiem lub mniej małych liter
zawiera małą literę
nie zawiera żadnych zabronionych znaków interpunkcyjnych, trzech wystąpień dowolnego znaku, więcej niż jednego wystąpienia znaku podwójnego, nazwy użytkownika lub odwróconej nazwy użytkownika.
(Podziękowania dla Petera Taylora za wskazanie błędu w wersji 189 znaków).
źródło
use v5.10;
a to się nie udaje mój testowy przypadek „are regexes escaped poprawnie”. Zobacz ideone.com/QKFnZ\Q$u\E|\Q$n
(ostatnia\E
może zostać pominięta, jeśli ta część zostanie przeniesiona na koniec).(.)(.*\1.*\1|\1.*(.)\3)
(nie testowane - nie będę próbował skryptować pełnej baterii testowej za pomocą ideonu).Ruby, 270 znaków
Implementacja ruby opiera się na dwunastu wyrażeniach regularnych. Każde wyrażenie jest dopasowaniem dodatnim (pierwsze pięć) lub ujemnym (ostatnie siedem). Jako ograniczenie nazwa użytkownika może zawierać tylko litery lub cyfry.
Pozytywne dopasowania wyrażeń regularnych:
/^.{8,12}$/
: mieć co najmniej 8 znaków !, nie może być dłuższy niż 12 znaków!/\p{Lower}/
i/\p{Upper}/
: mają wielkie i małe litery!/^(\p{Alpha}.*){2}/
: mieć co najmniej 2 litery (litery) !, mieć literę wiodącą!/\d/
: mieć co najmniej 1 cyfrę (y)!Negatywne dopasowania wyrażeń regularnych:
/(\p{Lower}.*){9}/
: nie więcej niż 8 małych liter!/(\p{Upper}.*){9}/
: mieć nie więcej niż 8 wielkich liter!/(.)\1.*(.)\2/
: mieć nie więcej niż 1 parę powtarzających się postaci!/(.).*\1.*\1/
: nie ma 3 wystąpień tej samej postaci!/[ ^=&#,;"<>\[|)]/
: nie zawiera znaku karetki, spacji, =, &, #, ,,;, ",>, <, [, |,)/#{u}/
: nie może być Twoją nazwą użytkownika!, nie zawiera Twojej nazwy użytkownika!/#{u.reverse}/
: nie bądź odwrotnie nazwą użytkownika !, nie odwracaj nazwy użytkownika!źródło
Python 3, 291 bajtów / znaków
Bardziej ładnie sformatowane i skomentowane:
Możesz znaleźć to rozwiązanie na ideone.com , ale dane wyjściowe wyglądają nieco brzydko, ponieważ nie pokazują tam predefiniowanych danych wejściowych ani nawet podziałów linii. Ponadto kombinacja nazwy użytkownika i hasła
"JOE.smith"
-"JOE!smith123"
jest obecnie wprowadzana jako stałe dane wejściowe.Dodałem jednak zestawienie wszystkich kontroli jako danych wyjściowych debugowania.
źródło