Atacul de dicționar ( atac de dicționar englez ) - un atac asupra sistemului de securitate folosind metoda de enumerare completă ( forța brută engleză ) a parolelor destinate utilizate pentru autentificare , efectuat prin revizuirea secvențială a tuturor cuvintelor ( parole în forma lor pură sau criptate ). imagini) de un anumit tip și lungime din dicționar pentru a pirata ulterior sistemul și a avea acces la informații clasificate . [1] Acest eveniment, în cele mai multe cazuri, este de natură negativă, contrar normelor morale și legislative.
Din punctul de vedere al teoriei probabilităților , alegerea unei parole este deterministă și logică. Parola poate fi: data nașterii, nume, obiect, un set de numere, o succesiune de litere strâns distanțate pe tastatură. În cazul general, cele de mai sus sunt concatenate .
Rezultatul acestor ipoteze este că predeterminarea în alegerea parolei joacă un rol cheie în alegerea algoritmilor pe care se bazează metoda de căutare în dicționar .
Există două tipuri de atacuri:
Este posibil să se calculeze un scor de putere a parolei, în special, pentru a determina proporția de atacuri de succes ale dicționarului . Scorul de probabilitate de succes poate fi definit ca raportul dintre numărul de parole sparte într- un atac de dicționar și numărul total de încercări.
Utilizarea Internet Worm în 1988 oferă un caz bine documentat de spargere a parolelor. [2] Viermele a încercat să spargă parole lucrând cu o serie de dicționare. Prima etapă a atacului a folosit un set de cuvinte care conțineau nume de utilizator preluate din fișierul de parole al sistemului Unix. Dacă acest lucru nu a avut succes, a fost folosit un dicționar intern de 432 de cuvinte din jargon de pe Internet utilizate în mod obișnuit. Dacă al doilea pas nu a avut succes, a fost folosit un dicționar Unix de 24474 de cuvinte. Viermele a verificat și o parolă goală. Site-urile atacate au raportat că aproximativ 50% dintre parole au fost sparte cu succes folosind această strategie.
Următorul pas a fost opera lui Daniel Klein . [3] Pentru a furniza rezultatele sale, el a colectat fișiere criptate cu parole de sistem Unix . Această colecție conținea aproximativ 15.000 de perechi diferite nume utilizator/parolă ( login/parolă ) . Klein a construit o serie de dicționare și un set de mecanisme pentru a permite permutările. Dicționarul oferit de el a constat din aproximativ 60.000 de articole. Această fișă cuprindea nume, locuri, referințe fictive, termeni biblici, expresii din poemele lui W. Shakespeare etc. După aplicarea unei strategii de permutare (folosirea literelor majuscule, înlocuiri evidente, permutări de numere), a primit un spațiu de parolă de peste 3,3 milioane de posibilități. Folosirea acestui dicționar l-a ajutat pe Klein să spargă 24,2% din toate parolele de pe anumite servere.
În 1991-1992. Eugene Spafford( ing. Eugene Spafford ) a reușit să construiască, pe baza statisticilor, un dicționar cu care 20% din parolele de pe serverele selectate au cedat cracking-ului. [patru]
În anul 2000, o echipă de cercetători de la Universitatea din Cambridge a realizat un studiu în care au fost atacate 195 de parole hashed , dintre care 35% au fost sparte cu succes. [5]
Cercetător(i) / proiect | Timp | Parolele verificate | Procent de constatare, [%] |
---|---|---|---|
vierme de internet [2] | 1988 | mii | ~50 |
Studiul lui Klein [3] | 1990 | 15000 | 24.2 |
studiul lui Spafford[patru] | 1992 | 13787 | 20,0 |
Cercetători de la Universitatea din Cambridge [5] | 2000 | 195 | 35,0 |
În majoritatea parolelor, există o similitudine fonetică cu cuvintele din limba naturală (engleză); motivul pentru aceasta este ușurința de a reține acest tip de informații despre o anumită parolă. Această proprietate este luată în considerare în „Filtrele Markov” bazate pe lanțul Markov , care este o tehnică standard în procesarea limbajului natural. Prezența caracterelor non-alfabetice în parolă poate fi interpretată ca aplicarea unei mașini de stări unui anumit set de elemente.
O parolă alfabetică generată de om este distribuită inegal în spațiul secvențelor alfabetice. Această condiție poate fi luată în considerare cu mare precizie în „filtrele Markov” de ordinul zero și primul: [6]
Din punct de vedere matematic,
ordinul zero al modelului Markov:
primul ordin al modelului Markov:
unde este probabilitatea de distribuție a unei secvențe de caractere, este caracterul acestei secvențe, este frecvența unui caracter individual sau a unei diagrame în text.
Pentru a elimina șirurile puțin probabile din dicționar, se utilizează discretizarea probabilității - este introdus un sistem cu două niveluri cu un prag :
ordinul zero al modelului Markov:
primul ordin al modelului Markov:
Remarci
Pentru a crea mașini de stat , sunt introduse unele restricții și ipoteze în legătură cu parola spartă:
Automatele finite deterministe sunt mijloace ideale pentru expresii cu constrângerile propuse. [6]
Primul pas în construirea unui dicționar bazat pe automate finite este crearea unei secvențe de expresii regulate ( \" minuscule " , \ " majuscule înainte de litere mici " , \ " toate majusculele vin înainte de litere mici " , etc.).
Un dicționar este definit ca un set de cuvinte care se potrivesc cu filtrele Markov și cu un număr finit de expresii regulate aplicate acestora.
Algoritmul folosit pentru a construi dicționarul este ușor diferit de filtrul Markov de nivel zero (în acest caz, un prag diferit va fi folosit pentru diferite lungimi de cuvinte în dicționar ). [6]
Dicționarul modificat este definit ca
Rescrieți filtrul (dicționarul) sub formă de aditiv
unde .
Lasă . Apoi definim dicționare parțiale . Rețineți că este definit deoarece , prin urmare, nu depinde de alegerea .
Pentru orice prefix , dicționarul parțial conține toate secvențele posibile de caractere care pot fi atașate acelui prefix , astfel încât șirul rezultat satisface toate proprietățile Markov.
În general, se poate scrie un dicționar parțial
Algoritm recursiv pentru calcularea dimensiunii unui dicționar parțial [6]
dimensiune_parțială1 ( lungimea_actuală , nivel ) { dacă nivelul >= prag : returnează 0 dacă lungimea_totală = lungimea_actuală : returnează 1 sumă = 0 pentru fiecare caracter în alfabet sum = sum + dimensiune_parțială1 ( lungime_curent + 1 , nivel + mu ( car ) ) returnează sumă }Algoritm recursiv pentru găsirea unei chei dintr-un dicționar (preia un index din spațiul de taste ca intrare și returnează cheia corespunzătoare ) [6]
get_key1 ( lungimea_actuală , index , nivel ) { if total_length = current_length : returnează „” sum = 0 pentru fiecare caracter din alfabet new_level = level + mu ( char ) // căutat din matrice precalculată dimensiune = partial_size1 [ current_length + 1 ][ new_level ] dacă sum + size > index // '|' se referă la concatenarea șirurilor return char | get_key1 ( lungimea_actuală + 1 , index - sumă , nou_nivel ) sum = sumă + dimensiune // controlul nu poate ajunge aici print "index mai mare decât dimensiunea keyspace" ; ieșire }Remarci
Ca și în cazul metodei ordinului zero, dicționarele parțiale sunt definite .
După ce căutați un șir într-un dicționar parțial , trebuie să vă faceți griji cu privire la ultimul caracter (ținând cont de diagramă și distribuția acesteia)
partial_size2 ( lungimea_actuală , caracterul anterior , nivel ) { dacă nivelul >= prag : returnează 0 dacă lungimea_totală = lungimea_actuală : returnează 1 sumă = 0 pentru fiecare caracter din alfabet dacă lungimea_actuală = 0 nivel_nou = mu ( car ) altfel new_level = nivel + mu ( prev_char ) , char ) sum = sum + partial_size2 ( lungime_actuală + 1 , char , new_level ) } get_key2 ( lungimea_actuală , index , caracterul anterior , nivel ) { dacă lungimea_totală = lungimea_actuală : returnează „” sum = 0 pentru caracter în alfabet dacă lungimea_actuală = 0 new_level = mu ( car ) altfel new_level = level + mu ( prev_char , char ) size = partial_size2 ( current_length + 1 , char , new_level ) if sum + size > index return char | get_key2 ( lungimea_actuală + 1 , sumă index , caracter , nivel_nou ) _ sum = sum + size // controlul nu poate ajunge aici print "index mai mare decât dimensiunea keyspace" ; ieșire }cometariu
Există mai multe moduri de a contracara atacurile de dicționar online :
Remarci
Se presupune că combinația corectă de autentificare/parolă este introdusă de utilizatorul acestui cont , în timp ce atacul dicționarului este efectuat de un program automat. Este necesar ca încercarea de a introduce parola corectă să fie „computațional simplă” pentru oameni și „computațional dificilă” pentru mașini.
Protocolul este un test care permite serverului să distingă un om de un bot . A fost propus pentru prima dată de M. Naor ( ing. Moni Naor ) și se numește testul Reverse Turing ( ing. Testul Reverse Turing (RTT) ), un alt nume pentru acesta este CAPTCHA . Testul Reverse Turing trebuie să îndeplinească următoarele condiții: [7]
Testul de imagine satisface toate condițiile de mai sus.
Protocolul 1 (combinație a testului invers al lui Turing cu orice sistem de autentificare) [8]
Utilizatorului i se cere să răspundă la un mesaj RTT înainte de a începe autentificarea (înainte de a introduce datele de conectare/parola ).
cometariu
Această metodă nu este optimă pentru sistemele mari, deoarece este destul de iritant și dificil din punct de vedere psihologic pentru utilizator să introducă răspunsul la testul RTT de fiecare dată înainte de autentificare . [opt]
Protocolul 2 (protocol de conectare a utilizatorului, versiunea modificată a protocolului 1) [8]
Dacă utilizatorul este conectat cu succes, serverul trimite un cookie către computerul utilizatorului care conține o înregistrare a autentificării utilizatorului și perioada de valabilitate a acestui mesaj (presupunând că incapacitatea de a modifica informațiile din cookie fără a anunța serverul (acest lucru poate fi garantat prin adăugarea unui MAC ( cod de autentificare a mesajelor ), care se calculează folosind o cheie cunoscută doar de server).
Remarci
Atacurile de dicționar offline pot fi prevenite sau îngreunate în următoarele moduri:
Trusted Platform Module (TPM) este un cip hardware care permite computerelor să păstreze datele în siguranță. Deținerea de informații secrete (denumite în continuare authData ) este necesară pentru a accesa și utiliza cheile TPM .
În timpul atacului, criptoanalistul poate afla: [9]
Compilarea dicționarelor pe baza informațiilor primite este utilizată într-un atac de dicționar offline pentru a determina authData .
Metode de luptă - folosind o metodă criptografică SPEKE modificată( Schimb exponențial de chei de parolă simplă ), care se bazează pe algoritmul de schimb de chei Diffie-Hellman (permite două părți să creeze un secret partajat ( ing. strong shared secret ), bazat pe un secret slab împărtășit ( ing. secret slab ), pe care îl împărtășesc).
Protocol (metoda criptografică modificată SPEKE)
1. utilizatorul execută comanda necesară pentru autorizarea cu authData ;
2. Procesul utilizatorului și TPM sunt incluse în protocolul SPEKE
, folosind ca un secret slab împărtășit ;
3. Procesul utilizatorului selectează unul aleator și îl trimite la TPM , unde este funcția hash ;
4. TPM alege unul aleatoriu și trimite procesului utilizatorului;
5. fiecare dintre ele calculează un secret ;
6. este înlocuit cu ca cheie HMAC .
Remarci