Jak działa generator: polska gramatyka w losowym haśle
Opublikowano:
Większość generatorów passphrase losuje słowa z listy i skleja je w ciąg bez związku:
krowa lampa ocean zegar. Nasz układa z nich poprawną frazę:
pseudonim dogadał się z koniem. Opisujemy, jak to robimy, skąd bierzemy słowa
i dlaczego gramatyka nie osłabia hasła, jeśli jego siłę liczy się poprawnie.
Ten artykuł jest techniczny. Jeśli chcesz tylko wiedzieć, czym jest passphrase i jak jej używać, zacznij od: Co to jest passphrase.
Dlaczego fraza, a nie lista słów
Cztery przypadkowe słowa to cztery osobne rzeczy do zapamiętania. Fraza to jedna scena: listonosz, który wypływa z fiatów, jest absurdalny, ale łatwo go sobie wyobrazić, a obraz pamiętamy lepiej niż listę. Gramatyka pomaga też przypomnieć sobie kolejność słów i ich formy: po „listonosz wypływa z” sama nasuwa się forma w dopełniaczu, „fiatów”.
W angielskim wystarczyłoby ułożyć słowa w odpowiedniej kolejności. Polski jest trudniejszy, bo
słowa się odmieniają. Jeden rzeczownik ma kilkanaście form, przymiotnik kilkadziesiąt, a czasownik
jeszcze więcej. Gdyby losować formy bez żadnych reguł, wyszłoby coś takiego jak
zielonej kotom czytali gazetą: słowa są polskie, ale nie tworzą frazy i trudno je
zapamiętać. Żeby wyszło zielony kot czyta gazetę, każda forma musi pasować do
pozostałych.
Skąd bierzemy słowa
Podstawą jest PoliMorf, słownik morfologiczny opracowany w Instytucie Podstaw Informatyki PAN (IPI PAN). Dla każdego słowa podaje wszystkie formy, a przy każdej formie jej opis gramatyczny: część mowy, liczbę, przypadek, rodzaj, osobę. Na przykład forma „kotem” to rzeczownik w liczbie pojedynczej, w narzędniku, w rodzaju męskożywotnym.
PoliMorf zawiera kilkaset tysięcy słów, także bardzo rzadkich, a hasło łatwiej zapamiętać ze słów, które dobrze znamy. Dlatego bierzemy tylko najczęstsze, według listy frekwencyjnej z korpusu współczesnej polszczyzny.
Korpus składa się z kilku części: literatury faktu, publicystyki i beletrystyki. Porównaliśmy je pod kątem zapamiętywania, używając norm psycholingwistycznych, czyli ocen tego, jak łatwo wyobrazić sobie dane słowo i w jakim wieku się go uczymy. Najlepiej wypadła beletrystyka. Słowa, które daje tylko ona, to na przykład dzbanek, wazon, budzik, szminka, bandaż. Słowa tylko z publicystyki to roszczenie, grzywna, dzierżawa, recesja, brutto. Beletrystyka wnosi też słowa książkowe, takie jak trzewia czy posępny, ale to, które słowa są rzadkie, zależy od tego, kto czyta.
Nawet wśród najczęstszych słów są takie, których w haśle nie chcemy. Pomijamy:
- Nazwy własne i słowa z łącznikiem: „Ślązak”, „hip-hop”, „coca-cola”.
- Stopień najwyższy przymiotników: „najzieleńszy” to tylko dłuższy „zielony”.
- Formy z przeczeniem: „nieczytający” łatwo pomylić z „czytający”.
- Formy przestarzałe, takie jak „aukcyj” zamiast „aukcji”.
- Wulgaryzmy, obelgi oraz słowa o narodowości, religii czy orientacji. Hasło nie zawsze zostaje tylko dla nas: ktoś może je zobaczyć na ekranie, a hasło do Wi-Fi często dyktujemy gościom. Losowa fraza z takim słowem łatwo też ułożyłaby się w obraźliwą wypowiedź o całej grupie ludzi. Nie chcemy, żeby generator losowych słów musiał tłumaczyć się z mowy nienawiści. Tę listę układamy ręcznie.
Ostatnia decyzja to długość słów. W generatorze wybierasz najdłuższe słowo: 8, 10, 12 albo 14 liter. Każda z tych opcji ma osobny słownik. Słownik krótszych słów ma więcej wyrazów podstawowych, żeby siła hasła pozostała na podobnym poziomie. Przy 10 literach (ustawienie domyślne) słownik ma ponad 11 tysięcy słów podstawowych i ponad 105 tysięcy ich form.
Wzorce fraz i zgodność form
Hasło powstaje według wzorca frazy. Najprostszy to przymiotnik i rzeczownik:
racjonalna parabola. Dłuższe dodają czasownik, dopełnienie, przysłówek albo
rzeczownik w dopełniaczu, który coś doprecyzowuje: parabola trzęsącego czajnika.
Wzorzec nie mówi jednak „przymiotnik, rzeczownik”, tylko podaje dokładne cechy każdej formy. Cechy, które muszą się zgadzać, są w nim zmiennymi: L to liczba, R to rodzaj. W uproszczeniu wzorzec „przymiotnik, rzeczownik, czasownik” wygląda tak:
| przymiotnik | rzeczownik | czasownik | |
|---|---|---|---|
| liczba | L | L | L |
| przypadek | mianownik | mianownik | — |
| rodzaj | R | R | — |
Ta sama zmienna ma w każdym słowie tę samą wartość. Wzorzec rozwija się więc w osobne wersje, po jednej na każde połączenie L i R. Generator losuje jedną z nich, z wagą równą liczbie fraz, jakie można z niej ułożyć (więcej o tym niżej). Dopiero potem losuje słowa w pasujących formach:
| L (liczba) | R (rodzaj) | fraza |
|---|---|---|
| pojedyncza | żeński | racjonalna parabola gubi |
| mnoga | żeński | racjonalne parabole gubią |
| mnoga | męskoosobowy | racjonalni listonosze gubią |
W czasie przeszłym czasownik musi zgadzać się jeszcze z rodzajem: „kot spał”, „kotka spała”, „koty spały”. Słownik rozróżnia na przykład męskoosobowy („ci listonosze przybiegli”), męskożywotny („widzę psa”) i męskorzeczowy („widzę stół”), bo każdy z nich odmienia się trochę inaczej.
Dla każdego słowa w każdej wersji wzorca generator ma osobną pulę pasujących form. Na przykład dla „rzeczownik w mianowniku, liczba pojedyncza, rodzaj żeński” są to wszystkie słowa takie jak „parabola”, „gruszka”, „linia”.
-
1
Wzorzec · cechy, które muszą się zgadzać, są zmiennymiprzymiotnik (L, R, mianownik) rzeczownik (L, R, mianownik)
-
2
Wersja · losowana z wagą równą liczbie frazL = pojedyncza R = żeński
-
3
Pule · wszystkie słowa w pasujących formach2 132 przymiotniki 2 346 rzeczowników 5 001 672 frazy
-
4
Hasło · słowa losowane z pul po równo
racjonalna gruszka
Czasowniki i przypadek dopełnienia
To była najtrudniejsza część. Przymiotnik zawsze zgadza się z rzeczownikiem według tych samych reguł. Czasownik natomiast sam decyduje, jakiego przypadku wymaga od dopełnienia. Mówimy „pomagać komuś”, „szukać czegoś”, „czekać na coś”, „bać się o kogoś”. Językoznawcy nazywają to związkiem rządu. Tego nie da się wywnioskować z formy czasownika, trzeba to wiedzieć o każdym czasowniku osobno.
Tę wiedzę bierzemy ze słownika walencyjnego Walenty, również opracowanego w IPI PAN. Opisuje, jakie konstrukcje tworzy każdy czasownik. „Pomagać” ma w nim kilka schematów: „pomagać komuś w czymś”, „pomagać komuś przy czymś”, „pomagać na coś” i inne. W haśle każdy czasownik ma tylko jeden przypadek dopełnienia, ewentualnie z przyimkiem i „się”. To celowe: jeden czasownik to zawsze jeden przyimek, więc przyimek wynika z czasownika i nie jest kolejną losową rzeczą do zapamiętania. Przy wyborze każda konstrukcja ze schematów czasownika dostaje punkty, a wygrywa ta, która zbierze ich najwięcej:
- Dopełnienie w bierniku („czytać gazetę”) dostaje najwięcej punktów, bo to zwykle główne dopełnienie: to, czego dotyczy czynność.
- Celownik i narzędnik dostają mniej, bo często tylko towarzyszą głównemu dopełnieniu: w „napisać komuś list” główne jest „list”, a „komuś” to dodatek.
- Kierunek i miejsce („do czegoś”, „w czymś”) też dostają mniej, bo częściej są okolicznikiem niż dopełnieniem.
- Przy remisie wygrywa konstrukcja, która występuje w większej liczbie schematów czasownika, a potem ta częstsza w całym słowniku.
-
komuś ✓celownik2
-
w czymśw + miejscownik2
-
czymśnarzędnik1,5
-
przy czymśprzy + miejscownik1
-
do czegośdo + dopełniacz1
-
na cośna + biernik1
Remis 2 : 2 rozstrzyga liczba schematów: „komuś” występuje w 7 z 8 schematów, „w czymś” w 2.
„Pomagać” dostaje w ten sposób celownik: „pomagać komuś”. Czasowniki, którym nie da się tak wybrać dopełnienia (bo go nie mają, jak „spać”) albo których Walenty nie opisuje, nie trafiają do haseł.
Ponieważ przyimek i „się” nie są losowane, generator pokazuje je jaśniejszym kolorem i nie liczy ich do liczby słów ani do siły hasła. Są jednak częścią hasła, tak jak pozostałe słowa. Do tego przyimki „z” i „w” zmieniają się w „ze” i „we” przed niektórymi grupami spółgłosek, tak jak w mowie: „ze snu”, „ze szkoły”, ale „z szafy”; „we wtorek”, ale „w wodzie”.
Kilka przykładów z generatora:
listonosz wypływa z fiatówpseudonim dogadał się z koniemgruszka odgryzie się za przodkabiedne rumaki nadeszły do posępnego łotrapytająca linia wiedziała o obrzuconej szybce
Poprawne, ale niekoniecznie sensowne
Gruszka, która odgryza się za przodka, nie ma sensu. Tak ma być. Generator dba o to, żeby fraza była poprawna, ale nie o to, żeby miała sens. Powodem jest siła hasła.
Każdy filtr „czy to ma sens” zmniejszałby liczbę możliwych fraz, więc hasło byłoby słabsze. Istnieją słowniki i korpusy, które opisują, jakie słowa często występują razem w tekstach. Dzięki nim frazy brzmiałyby naturalniej, ale celowo ich nie używamy: hasła byłyby wtedy zbudowane z połączeń, które zna każdy, a więc także atakujący.
Absurd jest więc dozwolony, błąd gramatyczny nie. „Czajnik pogratulował parasolowi” jest dziwne, ale poprawne (gratuluje się komuś, tak jak w „pogratulował mu wygranej”). „Czajnik pogratulował parasol” jest już błędem, bo „pogratulować” nie łączy się z biernikiem. Takich fraz generator nie powinien tworzyć.
Jak liczymy siłę hasła
Tu gramatyka może osłabić hasło, jeśli losuje się na skróty. Najprostszy sposób to wylosować wzorzec, potem w nim liczbę i rodzaj, a na końcu słowa z odpowiednich pul. Ale pule mają bardzo różne rozmiary. Rzeczowników męskich w liczbie pojedynczej jest kilka tysięcy, a w rzadszych kombinacjach rodzaju i liczby zostaje kilkaset albo kilkanaście słów. Gdyby każdą kombinację losować z tym samym prawdopodobieństwem, słowa z małych pul wypadałyby nieproporcjonalnie często. Atakujący zacząłby od nich, a hasło byłoby słabsze, niż wynika z prostego rachunku.
przy równym losowaniu
-
1 na 210 mlnżeński racjonalna gruszka5 001 672
-
1 na 199 mlnmęskorzeczowy nowy stół4 741 374
-
1 na 82 mlnmęskoosobowy dobry listonosz1 951 566
-
1 na 61 mlnnijaki ciepłe mleko1 442 013
-
1 na 34 mlnmęskożywotny szybki koń820 914
-
1 na 970 tys.nijaki jak „oko” lewe oko23 089
Dlatego każdą wersję wzorca losujemy z prawdopodobieństwem proporcjonalnym do liczby fraz, jakie można z niej ułożyć, czyli do iloczynu rozmiarów jej pul. Wersja, która daje milion fraz, wypada tysiąc razy częściej niż ta, która daje tysiąc. Słowa w pulach losujemy po równo. W efekcie każda możliwa fraza jest tak samo prawdopodobna, z jednym wyjątkiem, który opisujemy w „Co jeszcze do poprawy”. Siła hasła to więc po prostu logarytm dwójkowy z liczby wszystkich fraz:
entropia = log₂(liczba wszystkich możliwych haseł)
Generator liczy tę wartość dla każdego ustawienia i pokazuje ją przy haśle. Zakładamy przy tym najgorszy przypadek: atakujący zna nasz słownik, wszystkie wzorce i sposób losowania. Siła hasła opiera się tylko na tym, że nie wie, co się tym razem wylosowało. Tak samo działa każde porządne zabezpieczenie: jego siła nie może zależeć od tajemnicy metody.
Losowanie odbywa się w przeglądarce, przy użyciu generatora liczb losowych przeznaczonego do
kryptografii (crypto.getRandomValues). Hasło nie trafia na żaden serwer.
Ile kosztuje gramatyka
Gramatyka zawęża wybór: na danym miejscu we frazie może występować tylko forma o określonych cechach. Gdyby losować każde słowo spośród wszystkich 105 tysięcy form, dostalibyśmy 16,7 bitu na słowo. Z gramatyką wychodzi około 13 bitów. Tyle samo daje Diceware, standardowa lista 7776 słów do passphrase (12,9 bitu na słowo). W porównaniu z nią fraza zamiast listy nic więc nie kosztuje.
| Liczba słów | Entropia hasła | Na słowo | Liczba haseł | Diceware, tyle samo słów |
|---|---|---|---|---|
| 2 | 25,9 bitu | 12,9 bitu | ≈ 6,1 × 107 | 25,8 bitu |
| 3 | 40,6 bitu | 13,5 bitu | ≈ 1,7 × 1012 | 38,8 bitu |
| 4 | 52,4 bitu | 13,1 bitu | ≈ 6,1 × 1015 | 51,7 bitu |
| 5 | 64,0 bitu | 12,8 bitu | ≈ 1,8 × 1019 | 64,6 bitu |
| 6 | 78,0 bitu | 13,0 bitu | ≈ 2,9 × 1023 | 77,5 bitu |
| 7 | 90,0 bitu | 12,9 bitu | ≈ 1,3 × 1027 | 90,5 bitu |
| 8 | 103,7 bitu | 13,0 bitu | ≈ 1,6 × 1031 | 103,4 bitu |
| 9 | 114,4 bitu | 12,7 bitu | ≈ 2,7 × 1034 | 116,3 bitu |
Słownik z najdłuższym słowem 10 liter. Przy 8, 12 i 14 literach wyniki różnią się najwyżej o kilka dziesiątych bitu.
Na każdą liczbę słów generator ma kilka kształtów frazy. Przy czterech słowach to na przykład:
- przymiotnik, rzeczownik i dopełniacz z przymiotnikiem:
racjonalna parabola trzęsącego czajnika, - rzeczownik, czasownik i dopełnienie z przymiotnikiem:
kot je dobrego tuńczyka, - rzeczownik, przysłówek, czasownik i dopełnienie:
kot szybko je tuńczyka.
Nie są to jednak wszystkie możliwe kształty. Na przykład gruby kot je tuńczyka
też ma cztery słowa, ale generator takich fraz nie tworzy. Próbowaliśmy dopuszczać więcej kombinacji, ale hasła traciły
przez to spójny charakter, a siła prawie nie rosła. Dodanie wariantu, który nie jest większy od
największego z już istniejących, daje najwyżej jeden bit więcej, bo liczba haseł co najwyżej
się podwaja.
Ile bitów potrzebujesz i jak długo trwa łamanie haseł o danej sile, opisujemy w artykułach Entropia hasła i Ataki na hasła.
Co jeszcze do poprawy
Generator ma też słabe strony:
- Wybór przypadku dopełnienia jest mechaniczny: Walenty ma dla „bać się” więcej schematów z „o”, więc wychodzi „bać się o kogoś”, choć częściej mówimy „bać się czegoś”. Fraza jest poprawna, ale nie zawsze najbardziej naturalne.
- Niektóre przymiotniki słownik notuje również jako rzeczowniki („drugie” jako drugie danie, „prywatne”), przez co zdarzają się frazy, które czyta się z trudem.
- Ta sama forma słowa często pasuje do kilku wersji wzorca. „Pilot” może być osobą albo urządzeniem, a słownik zapisuje te znaczenia w różnych rodzajach. W „nowego pilota” oba znaczenia dają jednak ten sam tekst. Generator liczy wtedy kilka sposobów ułożenia tego samego napisu jako różne hasła, więc podawana siła jest trochę zawyżona. Zmierzyliśmy to na losowej próbie haseł: różnica wynosi od 0,1 bitu przy jednym słowie do 0,8 bitu przy ośmiu, czyli mniej niż 1% siły hasła.
Jeśli trafisz na hasło, które jest gramatycznie błędne, a nie tylko absurdalne, napisz do nas. Każdy taki przykład pomaga poprawić słownik.
Co z tego wynika
Hasło ułożone w poprawną frazę nie jest przez to słabsze. Fraza z generatora jest prawie tak samo trudna do złamania jak lista słów z Diceware o tej samej długości, nawet jeśli atakujący zna nasz słownik, wszystkie wzorce i ustawienia. Liczy się tylko to, ile słów ma hasło i czy je wylosowano.
Stąd jedna praktyczna rada: nie poprawiaj wylosowanej frazy tak, żeby miała więcej sensu, i nie wstawiaj do niej własnych słów. Każda taka zmiana sprawia, że hasło przestaje być losowe, a hasło wymyślone przez człowieka łatwiej odgadnąć.
Wypróbuj: wygeneruj passphrase z polskich słów.