Dlaczego to losowe hasło jest oznaczone jako zbyt uproszczone / systematyczne?

37

W jaki sposób losowy ciąg znaków M1uG*xgRCthKWwjIjWc*010iSthY9bucjest wykrywany jako zbyt uproszczony / systematyczny dla hasła zgodnie z passwd i cracklib-check ? Wypróbuj na swoim komputerze i przekonaj się

echo "M1uG*xgRCthKWwjIjWc*010iSthY9buc" | cracklib-check

Zauważ, że to nie jest moje hasło, ale inny losowo generowany ciąg z tego samego generatora losowych haseł, który daje ten sam wynik.

BeowulfNode42
źródło
3
MówiM1uG*xgRCthKWwjIjWc*010iSthY9buc: OK
rici
Okazuje się, że tylko niektóre wersje uznają to za proste. Zobacz odpowiedź SLM, aby uzyskać więcej informacji na ten temat.
BeowulfNode42
Dlaczego zamiast tego nie /dev/urandomwygenerujesz hasła?
devnull
@devnull - nie jestem pewien, co miałeś na myśli, ale dodałem 2 metody do mojego A dotyczące generowania haseł.
slm

Odpowiedzi:

59

Ponieważ cracklib jest oprogramowaniem typu open source, odpowiedź można znaleźć w kodzie źródłowym .

„Zbyt uproszczony / systematyczny” oznacza, że ​​istnieje zbyt wiele znaków poprzedzonych przez jednego z ich alfabetycznych sąsiadów. Dlatego „ab” lub „ba” są uważane za złe, ale „ac” lub „ca” są w porządku, ponieważ b jest pominięte.

Przed aktualizacją z 02.03.2010 r. Zezwala na maksymalnie cztery postacie, które wykazują tę cechę. Na przykład „bar12345” nie powiedzie się, ponieważ znaki „a”, „2”, „3”, „4” i „5” są alfabetycznymi sąsiadami poprzedzających znaków.

slm dowiedział się w swojej odpowiedzi, że M1uG*xgRCthKWwjIjWc*010iSbyło OK, a M1uG*xgRCthKWwjIjWc*010iStnie jest. Przeanalizujmy. Oto znaki, które według cracklib-check wskazują na systematyczne hasło:

M1uG*xgRCthKWwjIjWc*010iS
               ^^    ^^

co jest poniżej maksimum czterech, ale dodaje t:

M1uG*xgRCthKWwjIjWc*010iSt
               ^^    ^^  ^

przesuwa go powyżej limitu, ponieważ T następuje po S (wydaje się, że w teście nie jest rozróżniana wielkość liter).

Łatka zmienia maksymalny limit, więc zależy to od całkowitej długości hasła, aby uniknąć takich fałszywych alarmów.

jemiołucha
źródło
1
Czy 010 nie powinien już liczyć się jako 3? Świetna odpowiedź.
John V.
1
Świetna odpowiedź i dziękuję za podanie dokładnego kodu różnicowego. Nawiasem mówiąc, czy jest jakiś powód, dla którego ten plik nosi nazwę fascist.c?
laurent
@ this.lau_ - Zgaduję: en.wikipedia.org/wiki/Fascism
slm
Nieco zabawnie jest mówić o „mniejszych” i „większych” w odniesieniu do postaci, prawda? Cóż, choć wiem, że dotyczy wartości ASCII, może nie być to zbyt oczywiste. - Dlaczego więc nie wyjaśnić tego w bardziej uproszczony sposób? Bezpośrednim sąsiadem ani poprzednikiem nie może podążać żadna postać. Dlatego ani „ab”, ani „ba” nie są dozwolone, ale „ac” lub „ca” byłyby, ponieważ b jest pominięte.
składniaerror
Czy istnieje powód, dla którego nie może być jeden mniejszy lub wyższy, ale może być taki sam ( Ww)?
Jeroen Vannevel
31

Na Fedorze 19

Kiedy go uruchamiam, wszystko jest OK. Jestem na Fedorze 19.

$ echo 'M1uG*xgRCthKWwjIjWc*010iSthY9buc' | cracklib-check
M1uG*xgRCthKWwjIjWc*010iSthY9buc: OK

Oto informacje o wersji:

$ rpm -qfi /usr/sbin/cracklib-check | grep -E "Version|Release"
Version     : 2.8.22
Release     : 3.fc19

UWAGA: Wypróbowałbym to również z pojedynczymi cudzysłowami zamiast podwójnych qutoes, ponieważ masz do czynienia z tymi, *które mogą się w ciebie dziwnie rozszerzać.

CentOS 5 i 6

Wypróbowanie przykładu na CentOS 6 było w porządku, dostało się OK, ale nie powiedzie się tak, jak opisano w CentOS 5.9.

$ echo 'M1uG*xgRCthKWwjIjWc*010iSthY9buc' | cracklib-check
M1uG*xgRCthKWwjIjWc*010iSthY9buc: it is too simplistic/systematic

Informacje o wersji:

$ rpm -qfi /usr/sbin/cracklib-check | grep -E "Version|Release"
Version     : 2.8.9                  
Release     : 3.3

Błąd?

To, w co wpadłeś, wydaje się być błędem. Jeśli weźmiesz swój ciąg i wpuścisz w niego coraz więcej cracklib-check, zauważysz, że gdy dojdziesz do 26 znaku, zaczyna się on nie powieść:

# 25    
$ cracklib-check <<<"M1uG*xgRCthKWwjIjWc*010iS"
M1uG*xgRCthKWwjIjWc*010iS: OK

# 26
$ cracklib-check <<<"M1uG*xgRCthKWwjIjWc*010iSt"
M1uG*xgRCthKWwjIjWc*010iSt: it is too simplistic/systematic

Pogłębię to, jeśli zmienię ostatnią postać z a, taby powiedzieć, vże nadal działa.

$ cracklib-check <<<"M1uG*xgRCthKWwjIjWc*010iSvhY9b"
M1uG*xgRCthKWwjIjWc*010iSvhY9b: OK

Wydaje się więc, że w wersji cracklib-checkodkładanie się na podciąg Sth.

Zdecydowanie coś dziwnego jest w podanych fragmentach łańcucha. Jeśli wezmę końcówkę ogona i pominę przednią część, mogę również spowodować awarię tej części.

$ cracklib-check <<<"jIjc*010Sth"
jIjc*010Sth: it is too simplistic/systematic

Ten sam ciąg powoduje problemy również w Fedorze 19 i CentOS 6!

AKTUALIZACJA # 1

Opierając się na bardzo ładnym przemyśleniu @ waxwing , wiemy teraz, że heurystyka ulegała potknięciu, jeśli> 4 znaki były zbyt blisko siebie. Wprowadzono łatkę, która zmieniła tę heurystykę, dzięki czemu uwzględniono całkowitą długość rozpatrywanego hasła w celu wyeliminowania tych fałszywych trafień.

Wnioski

Na podstawie niektórych moich ograniczonych testów wydaje się, że w grę wchodzą tutaj dziwne heurystyki. Pewne łańcuchy, które z pozoru byłyby w porządku, powodują potknięcie.

Jeśli próbujesz to skodyfikować, sugeruję zawinięcie generowania i oceny hasła, a następnie wyrwanie się z pętli po wygenerowaniu hasła, które ustępuje cracklib-check.

A przynajmniej sugeruję aktualizację do nowszej wersji, która zawiera poprawki, o których wspomina @maxwing w swojej odpowiedzi.

Alternatywy Genów haseł

pwgen

Dodam też, że zwykle używam pwgendo generowania haseł. To też może ci się przydać.

$ pwgen -1cny 32
iWu0iPh8aena9raSoh{v6me)eh:eu6Ei
urandom

Można też użyć trochę magii ze skryptów tr, /dev/urandomi folduzyskać bardzo wysoką jakość losowe hasło.

$ tr -dc '[:graph:]' </dev/urandom | fold -w 32 | head -n 1
;>$7\`Hl$=zn}R.b3h/uf7mY54xp}zSF

foldKomenda może kontrolować długość. Alternatywnie możesz to również zrobić:

$ echo $(tr -dc '[:graph:]' </dev/urandom | head -c 32)
/_U>s[#_eLKAl(mrE@oo%X~/pcg$6-kr
slm
źródło
Pracowałem na CentOS 5.5 z cracklib-2.8.9-3.1.src.rpm. W obu przypadkach, w jaki sposób tak długi losowy ciąg może być zbyt prosty?
BeowulfNode42
@ BeowulfNode42 - nie jest. Wygląda na to, że znalazłeś błąd lub przynajmniej ograniczenie implementacji.
slm
Dziwne. Jednak taki ciąg Tm7U:n=@*+4$*gf$6hOngEHJ;mnh$+R6jest w porządku na tej samej maszynie.
BeowulfNode42
1
Cudzysłowy zrobić zapobiec ekspansji glob. Pojedyncze cytaty są jednak nadal lepszym pomysłem, na wypadek gdyby ciąg znaków zawierał znaki dolara, backticks itp.
Dennis
2
„Wprowadzono łatkę ...” Należy również zauważyć, że łatka, o której mowa, nie jest wcale najnowsza (w przeciwieństwie do tego, jak może to brzmieć), ale została już wysłana w 2010 roku :)
składniaerror