Što web-mjesta znaju o vama?
Vi upravljate informacijama koje dajete web-mjestima koja posjećujete. Ne biste im trebali davati više informacija nego što im je potrebno za pružanje usluge koju želite. Ako ne očekujete da će vam web-mjesta isporučiti nešto na kućnu adresu, vjerojatno im ne biste trebali otkrivati svoju adresu samo zato što ona to traže od vas. Isto vrijedi i za vaš telefonski broj, ime i prezime ili čak adresu e-pošte. Što manje informacija pružite web-mjestima, manje ćete izgubiti ako netko ili proda informacije ili dobije pristup vašem računu.
Kada dođe do curenja podataka, oni se često objavljuju na internetu tako da ih drugi mogu vidjeti. Ako ste naveli majčino djevojačko prezime ili ime prvog kućnog ljubimca kao odgovor na sigurnosno pitanje, te bi informacije mogle postati dostupne bilo kome tko se zna služiti Googleom. Takva sigurnosna pitanja sama po sebi nisu sigurna jer djevojačko prezime vaše majke, ime kućnog ljubimca ili prva adresa obično se mogu vrlo lako otkriti.
Ali što ako iscuri informacija poput vaše lozinke? Jeste li koristili istu lozinku bilo gdje drugdje? Ako jeste, bilo tko može pokušati upotrijebiti kombinaciju vaše adrese e-pošte i lozinke na drugim mjestima. Informacije koje su iscurile često se koriste u drugim napadima čak i prije nego što se javno objave.
Lozinke su najčešće prva prepreka koja stoji na putu napadu. U kasnijim poglavljima uvest ćemo i druge elemente koji također mogu spriječiti napadače da pristupe vašim računima. Taj pristup dubinske obrane (engl. defense in depth) česta je praksa u kibernetičkoj sigurnosti. To znači da imate višestruke slojeve zaštite resursa koji želite zaštititi. Ako se slomi jedan sloj obrane, npr. vaša lozinka, to ne znači da napadači imaju slobodan pristup vašim informacijama.
Dubinska obrana je koncept koji se koristi u informacijskoj sigurnosti u kojemu se postavljaju višestruki slojevi kontrole sigurnosti (obrane) po cijelom sustavu informacijske tehnologije. Ona je namijenjena pružanju viška slojeva u slučaju da sigurnosna kontrola podbaci ili se iskoristi ranjivost koja može pokrivati aspekte osoblja i proceduralne, tehničke i fizičke sigurnosti za vrijeme životnog ciklusa sustava.
Kada je riječ o računima na internetu, lozinka je vjerojatno prvi zaštitni sloj koji imate. Malo ćemo detaljnije pojasniti kako lozinke funkcioniraju u teoriji prije nego što upoznamo druge slojeve koje možemo koristiti.
Napadi enumeracijom
Napadači koriste napade enumeracijom (engl. enumeration attacks) da bi utvrdili valjana korisnička imena, što je prvi korak potreban za dobivanje korisnikovih vjerodajnica za prijavu. Česta područja te vrste napada uključuju funkcije korisničke prijave i „zaboravljene lozinke“. Primjerice, web-mjesto može u nekim slučajevima nenamjerno odati informacije o svojim članovima prikazujući različite poruke za pokušaje prijave na temelju toga postoji li korisničko ime ili adresa e-pošte.
Jeste li ikada slučajno unijeli pogrešno korisničko ime nakon čega se pojavila poruka o pogrešci, „neispravno korisničko ime“ ili „korisničko ime ne postoji“? Ako web-mjesto ima sličnu poruku koja se pojavljuje samo u slučaju kada je lozinka neispravna, napadač može iskoristiti tu informaciju kako bi saznao je li korisničko ime ispravno. To omogućuje napadačima da, na primjer, enumeriraju velike popise adresa e-pošte i dobiju informacije o tome tko ima račun na ciljanom web-mjestu. Zato je za web-mjesta najbolje da imaju poruke o pogrešnoj prijavi koje ne navode točno što je pogrešno u pokušaju prijave. Primjerice, „neispravno korisničko ime ILI lozinka“.
U većini slučajeva ta informacija sama po sebi nije štetna. Međutim, ako bilo tko može provjeriti postoji li račun na usluzi za upoznavanje ili eskort, ta se informacija može koristiti protiv pojedinaca.
Napadi enumeracijom također se mogu koristiti za bolje ciljane phishing napade (napad krađom identiteta) na pojedince, a koriste se da bi olakšali napade grubom silom (engl. brute force) smanjujući broj mogućih meta. Uskoro ćemo govoriti o definicijama phishinga i napada grubom silom.
Napadi enumeracijom nisu ograničeni na obrasce za prijavu. Oni se mogu koristiti i u slučajevima vraćanja izvorne lozinke ili izrade računa. Izrada računa, primjerice, obično štiti od izrade dvostrukih računa te će obavijestiti korisnika koji pokuša stvoriti dvostruki račun da već postoji račun s navedenom adresom e-pošte ili korisničkim imenom.
Sljedeći korak u dobivanju pristupa za korištenje podataka za prijavu je poznavanje lozinke. O tome ćemo sljedeće učiti.
Lozinke
Većina web-mjesta koje koristite identificira vas s pomoću kombinacije korisničkog imena i lozinke. Budući da mi kao korisnici interneta moramo upotrebljavati nekoliko desetaka ili čak stotina različitih usluga, obično pokušavamo stvoriti lozinke koje možemo zapamtiti. Problem lozinki koje su lako pamtljive je taj što ih i napadači obično mogu lako pogoditi. S obzirom na to da su najčešće lozinke u 2020. bile 123456, 123456789, qwerty i password, nije teško hakirati velik broj računa samim unošenjem tih lozinki i nasumičnih adresa e-pošte.
Najčešće lozinke u 2020. godini
123456
123456789
qwerty
password
1234567
12345678
12345
iloveyou
111111
123123
Najčešći uvjeti za postavljanje lozinki već su godinama preslabi. Zahvaljujući njima, ljudi su se naučili stvarati loše lozinke. Te loše preporuke zahtijevale su od ljudi da stvore lozinke koje se teško mogu zapamtiti, a računala ih lako mogu otkriti.
Web-strip XKCD odlično rezimira zaštitu lozinki.
Dobra lozinka ne mora nužno sadržavati opskurne simbole da bi bila sigurna. Općenito, što je lozinka dulja, to je sigurnija. Zahtjevi koji traže da vaša lozinka mora sadržavati simbole, mala i velika slova i brojeve obično ne uzimaju u obzir koliko je zapravo teško otkriti takve lozinke. Ti zahtjevi povećavaju prostor ključeva (engl. keyspace) (količinu mogućih kombinacija lozinki prema određenoj duljini), iako se isto to može postići zahtijevanjem dulje lozinke.
Pogledajmo jedan primjer:
Ako mogući skup znakova koji možete koristiti za lozinku uključuje mala slova engleske abecede, tj. 26 znakova, a duljina lozinke je 6 nasumičnih znakova, prostor ključeva izračunava se ovako:
266= 308.915.776 mogućih lozinki
^ se često koristi za označavanje potencije, što se može iskazati i kao 26. Ne morate dobro znati matematiku, ali ako vas zanima, možete unijeti jednadžbu 26^6 u većinu mrežnih tražilica da biste dobili odgovor.
U slučaju da je lozinka duga 8 nasumičnih znakova, prostor ključeva iznosio bi:
268= 208.827.064.576 mogućih lozinki
Kao što možete vidjeti, prostor ključeva drastično se povećava ako je duljina lozinke veća za samo 2 slova. Uzmimo još jedan primjer s dodatnim znakovima. Dodajmo toj kombinaciji velika slova, čime se udvostručuje broj znakova koje možemo koristiti za lozinku.
526= 19.770.609.664 mogućih lozinki
Odmah primjećujete da je prostor ključeva mnogo veći od onoga s kojim smo počeli. Ipak, nije ni blizu prostoru ključeva za dulje lozinke koji koristi samo mala slova. Dodajmo sada neke opće simbole, tj. !, “, #, ¤, %, &, /, (, ) i =. To znači da je broj dostupnih znakova sada 62.
626= 56.800.235.584 mogućih lozinki
Dodavanjem 10 dodatnih znakova u dozvoljeni skup znakova gotovo smo učetverostručili prostor ključeva koji je dostupan. Istovremeno smo lozinku učinili mnogo težom za zapamtiti. Prostor ključeva i dalje je mnogo manji nego u primjeru lozinke od 8 znakova.
Potpuno nasumična lozinka sprečava druge vrste napada, kao što su napadi rječnikom. Napadi rječnikom (engl. dictionary attacks) koriste činjenicu da korisnici pokušavaju stvoriti lozinke koje će moći zapamtiti pa tako koriste riječi iz rječnika, imena ili varijacije. Drugo izdanje Oxfordovog rječnika engleskog jezika u 20 svezaka sadrži unose za 171 476 riječi. Ako koristite lozinku sa samo jednom riječju, možete to zamisliti kao da koristite prostor ključeva od 170 000. Često se te riječi ne koriste takve kakve jesu, nego se mijenjaju a da pritom ostaju lako pamtljive.
Otići ćemo još korak dalje i vidjeti kolika je veličina prostora ključeva ako koristimo samo jednostavne engleske riječi. Recimo da nasumično odaberemo 3 engleske riječi iz rječnika i stvorimo lozinku s tom kombinacijom. Izračun bi bio:
170 000^3 = 4.913.000.000.000.000
Lozinku poput ove mogli bismo puno lakše zapamtiti, a ako nas brine samo napad grubom silom, i on se puno teže može izvesti. Postoje i drugi razlozi zašto prostor ključeva možda neće biti one duljine koju bismo isprva pretpostavili. Većina govornika engleskog jezika koristi vokabular od samo oko 3 000 riječi, a lozinke koje su tako izrađene odražavaju tu činjenicu. Također, ljudima baš i ne ide smišljanje nasumičnih riječi. Lako je moguće da je ono što se nama čini kao nasumična kombinacija riječi nastalo pod utjecajem konteksta, naših misli ili prethodno odabranih riječi. Ako koristite lozinku koja se sastoji samo od riječi, upotrijebite generator umjesto da se oslanjate na ljudski koncept nasumičnosti.
Ljudi često pokušavaju izmijeniti riječi iz rječnika tako da koriste supstitucije ili nekoj riječi dodaju broj kako bi stvorili lozinku. Nažalost, računalo uglavnom dobro razumije te izmjene i bez problema može isprobati sve očekivane varijacije. Jednostavne zamjene, npr. zamjena slova „o“ s brojem „0“, dovode do toga da je lozinku teže zapamtiti, a računalu to ne predstavlja prevelik dodatan posao. Takve jednostavne supstitucije neće značajno povećati prostor ključeva. Neće ga povećati ni dodavanje broja ili trenutne godine na početku ili kraju riječi. Softveri za otkrivanje lozinki i ljudi koji ih izrađuju znaju sve te trikove i uzimaju ih u obzir.
Entropija
Jačina lozinke obično se ne mjeri samo po mogućem prostoru ključeva. „Entropija“ je pojam koji se također koristi u kibernetičkoj sigurnosti. On označava način mjerenja pretpostavljene težine otkrivanja lozinke u stvarnom svijetu. Entropija se izračunava tako da se matematička funkcija „log2“ primijeni na prostor ključeva (ne brinite ako vam ne ide matematika, nećete morati računati, ali ako stvarno želite, možete unijeti formulu u većinu tražilica koje će je riješiti. Na primjer, pokušajte unijeti „log2(26^8)“ u www.google.com).
Dakle, što entropija znači u praksi? Koristeći izračunati rezultat entropije možemo izmjeriti jačinu lozinke s pomoću ove tablice:
< 28 bitova = vrlo slaba; može štititi od članova obitelji,
28-35 bitova = slaba; trebala bi štititi od većine ljudi, često je dovoljna za lozinke za prijavu na stolno računalo,
36-59 bitova = umjereno jaka; prilično sigurne lozinke za mrežne i poslovne lozinke,
60-127 bitova = jaka; može biti dobra za zaštitu financijskih informacija,
više od 128 bitova = vrlo jaka; često jača nego što je potrebno.
U našem prethodnom primjeru, entropija lozinke od 8 znakova bila bi:
log2(26^8) = 37,6 bitova
Lozinka od 6 znakova imala bi entropiju od:
log2(26^6) = 28,2 bita
U gore navedenom primjeru entropija 8 nasumičnih znakova (37 bitova) na donjoj je granici umjereno jake kategorije. Lozinka od 15 znakova (70 bitova) bila bi jaka, ali i dalje nije u kategoriji vrlo jake lozinke. Budući da su ti izračuni eksponencijalni, to znači da produljivanje lozinke može znatno utjecati na težinu njezinog otkrivanja.
Iako je korisna, entropija nije mjerna vrijednost koja otkriva sve. Lozinka od samo 8 znakova može se i dalje smatrati uglavnom nesigurnom. U nastavku ćemo objasniti zašto je to tako.
Kako se lozinke otkrivaju
Da bismo vidjeli kako se lozinke otkrivaju, najprije moramo razumjeti kako se štite.
Lozinke se obično pohranjuju u bazu podataka, „šifriraju se“ s pomoću onoga što se naziva jednosmjerni algoritam raspršivanja. Algoritam raspršivanja (engl. hash algorithm) je šifra koja se koristi za pretvaranje vaše nešifrirane lozinke u šifrirani tekst. Funkcionira samo u jednom smjeru. Tekst koji je raspršen s pomoću sigurnog algoritma raspršivanja ne može se obrnuti unatoč tome što je algoritam poznat. Izlazni rezultat obrade vaše lozinke s pomoću algoritma raspršivanja naziva se raspršivanje. Raspršivanje (engl. hash) je niz znakova koji se sastoje od slova i brojeva, a predstavljaju šifriranu verziju izvornog ulaznog teksta.
Raspršivanje nije strogo rečeno šifriranje. Šifriranje (engl. encryption) je dvosmjeran proces koji se može obrnuti, dok je raspršivanje jednosmjerna ulica. Ako algoritam raspršivanja funkcionira na predviđen način, izlazna vrijednost ne može se obrnuti.
Možete pročitati više o kriptografskim funkcijama raspršivanja na Wikipediji.
Pogledajmo primjer poznatog algoritma raspršivanja koji se sada smatra nesigurnim: MD5. Koristeći MD5, ako raspršite riječ „password“ dobit ćete šifrirano izlazno raspršivanje koje glasi: „5f4dcc3b5aa765d61d8327deb882cf99“.
Neznatna promjena izvornog teksta stvorit će sasvim drukčiju raspršenu vrijednost. To je još jedna važna funkcija raspršivanja. Ne možete procijeniti raspršivanje na temelju ulazne vrijednosti.
Primjerice, raspršivanje s pomoću MD5 za „passwore“ je „a826176c6495c5116189db91770e20ce“, što nije ni blizu raspršivanja za riječ „password“.
Kada se korisnik prijavi, njegova lozinka s nešifriranim tekstom se raspršuje i rezultat toga uspoređuje se s vrijednosti raspršivanja (šifrirana verzija korisničke lozinke) koja je pohranjena u bazi podataka. Ako se podudaraju, korisnik se može prijaviti.
S obzirom na svu tu zaštitu, kojom se nešifrirane lozinke pretvaraju u nepredvidivu šifru s pomoću nepovratnog algoritma, kako se lozinke mogu hakirati? Što čini starije algoritme raspršivanja poput MD5 ranjivima?
Raspršena vrijednost (šifrirana verzija izvorne lozinke) može se predizračunati i pohraniti na golemom popisu lozinki. Te se datoteke nazivaju dugine tablice (engl. rainbow tables) i lako se mogu naći na internetu. Primjerice, možete lako pronaći datoteku sa svim raspršivanjima stvorenim s pomoću MD5 algoritma za bilo koju lozinku duljine do 10 znakova koja sadrži neku kombinaciju malih slova i brojeva (abcdefghijklmnopqrstuvwxyz0123456789).
Dugine tablice izrađuju se korištenjem rječnika lozinki (stvarne riječi iz rječnika kao i popisi najčešće korištenih lozinki) koje su na internetu pronašli algoritmi raspršivanja. Dobivena šifrirana raspršivanja poredaju se uz odgovarajuće unose izvornih nešifriranih lozinki, a zatim se koriste za hakiranje korisničkih računa.
Posoljena i raspršena
Znači li to da je raspršivanje zastarjelo za većinu lozinki? Ne! Dobra je vijest da programeri imaju nekoliko mudrih tehnika koje mogu upotrijebiti da bi otežali pronalaženje raspršivanja za lozinku. Funkcija raspršivanja često se primjenjuje više puta da bi se povećalo vrijeme potrebno za provjeru lozinke te da bi se odgodili napadi grubom silom.
Još jedan način na koji programeri štite lozinke svojih korisnika je korištenje tehnike poznate kao „soljenje“ (engl. salting). U tom slučaju posebna vrijednost, koja se naziva „sol“ (engl. salt), dodaje se nešifriranom tekstu nakon što korisnik unese svoju lozinku, a prije primjene raspršivanja, da bi se spriječila uporaba unaprijed izračunatog popisa raspršivanja (dugine tablice). Kada se primijeni, sol čini datoteku s duginim tablicama neupotrebljivom. To je vrlo lak način da se onemoguće takve vrste napada.
Na primjer, prilikom korištenja MD5 algoritma raspršivanja, ako dodamo nasumičnu sol „xhsr2d“ nešifriranom tekstu „password“, dobit ćemo MD5 („xhsr2dpassword“), što je „ebf20a6c99eccaefa0bf4d88a5bd3456“. To je potpuno drukčija izlazna vrijednost od izvornog raspršivanja riječi „password“ s pomoću MD5 o kojemu smo ranije govorili, a koji bilo koji haker može pronaći u duginoj tablici na internetu. Dodavanjem soli u lozinku, čak i kada bismo imali duginu tablicu s raspršivanjima za svaku moguću lozinku s malim slovima i najvećom duljinom od 10 znakova, ne bismo mogli pronaći podudarnu vrijednost za raspršivanje i omeli bismo uporabu unaprijed izračunatih raspršivanja.
U praksi, soljenje znači da napadači moraju napasti svaku lozinku grubom silom da bi uspješno hakirali šifrirana raspršivanja u bazi podataka.
Napadanje lozinki grubom silom (engl. brute forcing) znači korištenje snage računala za programsko isprobavanje različitih raspršivanja dok se ne otkrije lozinka s podudarnom vrijednosti raspršivanja. Funkcije raspršivanja oslanjaju se na to koliko je teško stvoriti dvije različite poruke koje proizvode istu vrijednost raspršivanja. To se zove kolizija (engl. collision). Ako se funkcija raspršivanja može prisiliti da generira iste vrijednosti za različite ulazne podatke, smatra se neispravnom.
Napadanje lozinki grubom silom može biti stvarno teško. Uz suvremena računala u sekundi možete izračunati tisuće raspršivanja. Grafičke kartice u suvremenim računalima su specijalizirani hardveri i zaista su vješte u izračunavanju raspršivanja. U nekim slučajevima mogu dosegnuti milijarde raspršivanja u sekundi.
Ipak, dugačka lozinka od 15 malih slova može imati 1.677.259.342.285.725.925.376 različitih varijacija, a izračunavanje toliko velikog broja raspršivanja pri brzini od 1 milijarde raspršivanja u sekundi potrajalo bi nešto više od 50 000 godina. Vrijeme izračuna smanjuje se na otprilike 3,5 minuta za lozinku duljine od 8 znakova.
Vi, kao korisnik mrežne usluge, obično ne možete biti sigurni koriste li razvojni inženjeri moguće preventivne mjere. To znači da biste trebali računati na to da bi se dugine tablice mogle koristiti protiv vaših lozinki. U praksi, to znači da biste trebali preferirati dulje lozinke jer one onemogućavaju uporabu većine duginih tablica. Sjetite se samo gore navedenog primjera. Dodavanjem 7 znakova vašoj lozinki možete ZNATNO otežati život hakeru!