Črke, ki odklepajo svet
Kljub številnim modernim poizkusom se glavni način za omejevanje dostopa vse od izuma računalnikov ni spremenil. Tako kakor vrata večinoma še vedno odklepamo s ključi, in ne s prstnimi odtisi ali karticami, se tudi prijavljamo v glavnem z uporabniškimi imeni in gesli. Računalniki in ljudje se razlikujejo, zato za nas težko zapomnljivo geslo ni nujno težko zlomljivo z računalnikom, in nasprotno.
Gesla so v računalništvu ena tistih stalnic, ki nas spremljajo od samega začetka in za katero se nihče ne more natančno spomniti, kdo jih je izumil. Navsezadnje so jih uporabljali že stari Rimljani, pomembno vlogo pa so odigrala v praktično vsaki vojni. Podobno kot je kljuka na vratih nekaj najbolj logičnega, sta tudi uporabniško ime in geslo nepogrešljiva sestavina računalništva.
Zgodba se je začela vsaj že leta 1961, ko so na univerzi MIT razvili računalnik s CTSS (Compatible Time-Sharing System). Ker je bil namenjen več uporabnikom, so se morali ti nekako enolično in zanesljivo predstaviti. Fernando Corbató, ki je razvijal CTSS, pravi, da to morda ni čisto prvi primer rabe gesel v računalništvu, je pa zagotovo med prvimi in najbolj znanimi. Ker so terminale uporabljali različni ljudje, ki so morali imeti dostop do vsak svojih datotek, je bila uporaba gesel logična, dodaja. Tako logična, da je niti patentiral ni nihče, čeprav ni rečeno, da se danes ne bi zgodilo niti to.
Za dobre zgoščevalne funkcije veljajo take, ki dajejo popolnoma nepredvidljiv rezultat.
V resnici bi lahko tudi v 60. letih namesto gesel uporabili kaj drugega. Računalnik bi lahko preprosto vprašal po nečem, kar veste samo vi, denimo številki zdravstvenega zavarovanja ali rojstnem datumu. A taka rešitev je bolj zapletena in zamudna, obenem pa terja več prostora na disku. Zato je bila odločitev za gesla tako enostavna, da sploh ni bila odločitev.
Zanimivo da je bil prav CTSS tudi prva žrtev površnega programiranja. Nekega dne leta 1966 se je računalniku zmešalo in namesto pozdravnega sporočila ob prijavi naj bi vsakomur prikazal gesla vseh registriranih uporabnikov. Četrt stoletja pozneje smo izvedeli, da je šlo za prvi primer kraje gesel. Raziskovalec Allan Scherr je tedaj za svoje raziskave potreboval veliko več kot dodeljene štiri ure računskega časa na teden. Zato je natisnil datoteko z vsemi gesli in se potem prijavljal tudi pod drugimi imeni. Da bi zakril sledi, je seznam z gesli delil tudi z drugimi.
Fernando Corbató je vodil ekipo, ki je razvila CTSS, verjetno prvi sistem z gesli. Slika: MIT Museum
In tu pridemo do naslednje pomembne točke – v kakšni obliki hraniti gesla. To, kar je počel CTSS, se imenuje hranjenje v besedilni obliki (plain-text). To je varnostno katastrofalna praksa, ki se danes ne sme več uporabljati, a jo ponekod še kljub temu najdemo. Poglejmo, kako to storimo pravilno.
Hranjenje gesel
Golo besedilo. Če naj geslo zagotavlja vstop v sistem, je seveda nekje treba hraniti aktivna gesla v nekakšni obliki, da lahko vtipkano geslo s čim primerjamo. Shranjevanje v besedilni obliki je napačno zato, ker mora biti sistem zasnovan tako, da tudi morebiten vdor povzroči kar najmanjšo škodo. V tem primeru bi lahko datoteko z gesli napadalci preprosto ukradli. To seveda ni edina pomanjkljivost. V resnici tak sistem nima praktično nobene prednosti, razen da lahko uporabniku pozabljeno geslo poiščemo, v drugih primerih pa je treba spet dodeliti (torej novo). A gesla morajo biti osebni podatek, do katerega ne sme imeti dostopa niti upravitelj. Golo besedilo zato odpade.
Simetrično šifrirana gesla. Zdi se logično, da bi torej uporabniška gesla šifrirali in jih na disku shranjevali le v šifrirani obliki (simetrično šifriranje). V zgodovini se je tak pristop uporabljal že v 70. letih, ko so gesla šifrirali z algoritmom DES. Tudi ta pristop je zelo slaba zamisel, in to ne zgolj zato, ker je bil DES do danes že zlomljen (uporablja zgolj 56-bitni ključ). S tem namreč še vedno ne rešimo ključnega problema. Poleg gesla v šifrirani obliki moramo imeti shranjen tudi ključ, da lahko ob prijavi vnos s čim primerjamo. Toda to pomeni, da lahko vsak upravitelj spet prebere katerokoli geslo, saj pozna ključ za dešifriranje. Še huje, tudi napadalci lahko ob vdoru pač ukradejo oboje in s tem spet dobijo vsa gesla. Tudi če jim to ne uspe, imajo vsa enaka gesla – verjemite, ljudje pri izbiranju gesel res nimajo domišljije – enak šifriran zapis. To je že pomemben podatek, četudi nimamo ključa.
Zgoščevanje. Pri hranjenju gesel moramo zadostiti trem pogojem: iz baze ne sme biti možno prebrati gesla, enaka ali zgolj samo podobna gesla morajo biti zapisana popolnoma drugače za vsakega uporabnika in iz zapisa ne sme biti mogoče sklepati o dolžini gesla. Problem poizkusimo rešiti z uporabo algoritmov za izračun zgoščenih vrednosti (hash). To so funkcije, ki iz vsakih vhodnih podatkov izračunajo izhodni niz enake dolžine. Za dobre funkcije veljajo take, ki dajejo popolnoma nepredvidljiv rezultat, ki se ob majhnih variacijah vhoda drastično spremeni, kjer ne moremo izračunati, kateri vhodi bodo dali enak izhod (to je možno le slučajno, a se v praksi ne sme zgoditi, sicer imamo kolizijo), in kjer iz izhoda ne sme biti mogoče sklepati popolnoma nič o vhodu. Standardizirani algoritmi v ta namen so zastarela MD5 in SHA-1 ter boljši SHA-256.
Ker nimamo nikoli shranjenih gesel, jih ne moremo videti. Pri prijavi se primerjata shranjena zgoščena vrednost in izračunana iz vnosa.
Toda tudi ta rešitev ne zadostuje. Če hranimo zgoščeno vrednost gesel, lahko sicer uporabniki izberejo poljubno dolgo geslo, pa bo hash vedno enako dolg. Toda – za enaka gesla bo enak. Napadalci lahko zato zelo pogosta gesla uganejo, kar imajo zanje zagotovo že preračunane zgoščene vrednosti.
Zgoščevanje z zrnom soli. Vse probleme rešujejo začimbe, v konkretnem primeru zrno soli (salt). Tako imenujemo naključno vrednost, ki jo ustvarimo za vsako geslo. Potem jo pripnemo h geslu in skozi algoritem za izračun zgoščene vrednosti pošljemo ta sklop. V bazo potem shranjujemo sol kot golo besedilo, ker ne predstavlja gesla in ni zaščiten podatek, ter zgoščeno vrednost posoljenega gesla. Če zrna soli ustvarjamo z dobrim algoritmom za naključnost, je to dovolj. Enaka gesla imajo povsem različne zgoščene vrednosti, hekerji pa se niti na najpogostejša gesla (npr. 123456 ali qwertz) ne morejo pripraviti z vnaprej izračunanimi zgoščenimi vrednostmi, ker imajo vsakokrat drugačno predpono. Četudi nam ukradejo zbirko podatkov z gesli, si z njo še lep čas nihče ne bo mogel pomagati.
Varno shranjevanje gesel obsega počasen zgoščevalni algoritem in sol.
Več iteracij. Edini potencialni problem takega shranjevanja gesel je čedalje hitreje rastoča računska moč, ki počasi omogoča izvedbo napadov s surovo silo (brute force). Obramba prav tako temelji na surovi sili. Z vidika uporabnika ni prav nobene razlike, ali izračun zgoščene vrednosti iz posoljenega gesla ob prijavi traja milijoninko sekunde ali pa morda desetinko. Pri lomljenju gesel s surovo silo, ko se poizkuša več milijard gesel, pa je to zelo pomembno. Pri tem ne zadostuje, da omejimo število poizkusov. Če hekerji ukradejo zbirko, imajo na voljo ves čas na svetu, da jo lepo krajevno zlomijo – poizkusijo vsa možna gesla in vse zgoščene vrednosti, ki jih imate v zbirki.
V ta namen se uporabljajo algoritmi, denimo bcrypt, scrypt ali PBKDF2, ki storijo točno to. Vključujejo večkratni (iterativni) izračun zgoščene vrednosti, ki zato traja dlje, zaradi česar je lomljenje z ugibanjem nepraktično, prijava pa še vedno povsem spodobno hitra. V zbirki tako shranjujemo število iteracij, sol in zgoščeno vrednost posoljenega gesla.
Strinjamo se, da 123456, qwertz ali password niso dobra gesla. Kakšno pa je dobro »človeško« geslo?
In ko računska moč napreduje, zgolj podvojimo število iteracij in shranimo nove zgoščene vrednosti za gesla. Seveda lahko zapis gesla (število iteracij, uporabljen algoritem, zrno sol itd.) spremenimo le, ko se uporabnik uspešno prijavi. To je edini trenutek, ko imamo v pomnilniku dejansko geslo, da lahko potem izračunamo zgoščeno vrednost z novimi parametri. Za stare uporabnike, ki se že dalj časa niso prijavili, pa lahko gesla onemogočimo in jih pozovemo, naj si izmislijo nova.
Prav presenetljivo je, koliko spletnih strani in drugih zbirk podatkov se ne drži preprostega pravila, kako varno hraniti gesla: izbira dobrega generatorja naključnih števil za vsaj 16 bajtov dolgo zrno soli, uporaba PBKDF2 za iterativen izračun zgoščene vrednosti s HMAC-SHA-256 v vsaj 20.000 iteracijah, hranjenje zrna soli, števila iteracij in prvih 256 bitov zgoščene vrednosti v zbirki. Če število iteracij še pogosto posodabljamo, smo lahko varni. Tudi ob popolnem razgaljenju zaradi vdora si s takšno zbirko hekerji ne morejo dosti pomagati, uporabniška gesla pa so varna – če niso izbrana ne-varno (o tem v nadaljevanju).
Zavedati se moramo, da imamo do uporabnikov večjo odgovornost kakor zgolj preprečevanje nepooblaščenega dostopa. Ker številni ista ali podobna gesla uporabljajo za različne storitve, kar je sicer slaba praksa z imenom recikliranje gesel, jim dolgujemo tudi absolutno zaščito samih gesel, ne le vsebine, ki jo varujejo. S tem pridemo do naslednje točke, in sicer kako varno izbrati geslo.
Nič ni narobe, če imamo isto geslo za obskurne forume, zagotovo pa za pomembne stvari potrebujemo unikatna gesla.
O geslih
Strinjamo se, da 123456, qwertz ali password niso dobra gesla. Teže pa je odgovoriti na vprašanje, kakšno je dobro človeško geslo. Zagotovo je naključen niz 48 znakov odlično geslo, a si ga nihče pri zdravi pameti ne bo zapomnil. Lahko sicer uporabimo upravljalnike gesel, ki si jih za nas shranjujejo (več o njih v nadaljevanju), a vsaj za ta upravljalnik in operacijski sistem si moramo geslo še vedno zapomniti sami. Vprašamo se, ali je boljše geslo ZelenaRaketaLETInaMARS ali 3xkU1p4c1j4=0pr4v1c10 (poglejte ga od daleč, da boste videli logiko). Obe sta sorazmerno enostavno zapomnljivi, o pravilnem odgovoru pa se strokovnjaki še danes prepirajo.
Odgovor je odvisen od tega, pred čem se želimo zaščititi. Razlika je, ali se napadalec loti točno nas, pridobi o nas vse podatke in potem poizkusi pametno uganiti geslo, ali pa je naše geslo (zgoščena vrednost) zgolj eno izmed milijonov v neki ukradeni zbirki. Ni enako, ali napadalec lomi gesla v zbirki, ki jo je ukradel in ima v ta namen na voljo ves ljubi čas in računsko moč, ali pa se prek spleta prijavlja v storitev.
Če želimo varno geslo, moramo predpostaviti prvo možnost, saj se z zaščito pred njo avtomatično zavarujemo tudi pred neciljanim napadom. Privzeti moramo, da napadalec ve vse o nas in naših sistemih za tvorjenje gesel, pa ga še vedno ne sme biti sposoben uganiti. Pri tem z besedo uganiti ne mislimo vtipkati iz glave kakor v filmu, temveč s ciljani metodami preizkušati milijone verjetnih gesel, dokler ne najde pravega. Če imate radi pse, je NemškiOvčar11 zelo zelo slabo geslo (tudi če jih nimate, ni kaj dosti boljše).
Preden se lotimo vprašanja podrobneje, moramo pojasniti še pojem entropije. V fiziki je to količina, ki je povezana s številom mikroskopskih stanj, ki ustrezajo enakemu makroskopskemu stanju sistema. Poenostavljeno pogosto pravimo, da je to merilo za nered. V informatiki gre za sorodno količino (Shannonova entropija), ki podaja količino informacij, ki so v nekem podatkovnem nizu. Meri količino informacije, a je v tesni povezavi z napovedljivostjo in stisljivostjo.
Niz podatkov z največjo entropijo je popolnoma naključen, zato ne moremo na nobeni točki napovedati, kateri znak bo sledil predhodnim. Po drugi strani ima besedilo v slovenščini precej manjšo entropijo, saj lahko številne znake uganemo ali napovemo z visoko verjetnostjo. Če imamo pred seboj niz pomaran, lahko z visoko verjetnostjo napovemo, da bo naslednja črka v njem č, še naslednja pa a, e, o, i ali n.
Časi naivnega lomljena s surovo silo, kjer bi po vrsti preizkušali vse možne kombinacije črk in številk, so minili.
Ob tem je seveda poudariti, da je za »entropijo« pri lomljenju gesel treba gledati tudi vhodne informacije, ki jih preprost izračun ne more upoštevati. Geslo predsednikpahor je bistveno bolj predvidljivo kakor predsednikkranjc, čeprav imamo v obeh primerih kombinacijo besede iz slovarja in pogostega priimka. Entropija pri geslih je merilo za to, kako enostavno je geslo uganiti. Zato je neobhodno antropocentrična funkcija, torej odvisna od znanja človeka, ki skuša geslo zlomiti.
Kakšno je dobro geslo
Če želimo izbrati dobro geslo, je treba razumeti, kako poteka lomljenje. To ni več naivno poizkušanje vseh možnih kombinacij, začenši z aa, po abecedi in z naraščajočo dolžino, ker večina teh kombinacij ni geslo. Če napadalci dobijo predse zbirko, jih v njej verjetno ne zanima naše geslo, temveč čim večji odstotek zlomljenih gesel. Zato napadajo slovarsko, torej s seznami najpogosteje uporabljenih gesel.
Če gesla shranjujemo brez soli, imajo enaka gesla tudi enake zgoščene vrednosti, to pa je varnostno zelo slabo.
Napadalci vedo, da ljudje gesla v glavnem sestavljajo iz podstave, ki je izgovorljiva beseda (ne pa nujno tudi smiselna), in obrazila (ki je lahko za besedilom ali, redkeje, pred njim). V praksi bodo tako najprej preizkusili vsa možna preprosta gesla (npr. marjetica), potem pa izpeljanke (marjetica66). Za poizkušanje gesel so na voljo slovarji, ki so specializirani – angleški, z lastnimi imeni, datumi, slavne osebe itd. Geslo ILoveYouBaby87 je zelo slabo. ModraŽirafaNaKolesu je boljše le zato, ker ima več besed in ker so slovenske.
Slovarskih napadov ne smemo podcenjevati, ker so presenetljivo obsežni in dobro zadenejo psihologijo ljudi. Še več, če se napadalec loti specifično našega računa, bo poizkusil pridobiti dostop do diska in bo z orodjem avtomatično izdelal slovar, ki bo vseboval vse besede, ki se pojavijo v katerikoli datoteki na disku. Če smo si zapisali geslo v kakšno datoteko ali elektronsko pošto, smo pečeni v nekaj minutah.
V ukradenih zbirkah, četudi so gesla shranjena v primerni posoljeni obliki, napadalci navadno v nekaj dneh razbijejo tudi polovico gesel ali več.
Bruce Schneier zato priporoča, da si za geslo izberemo neko frazo, ki si jo bomo zlahka zapomnili, potem pa iz nje ustvarimo geslo. Če iz fraze V Kopru je bilo lani sončno sestavite geslo VKp=sonce2016, bo geslo sorazmerno težko uganiti. Tudi MojSijočVolvoS40JeRdeč ni slabo geslo. Po drugi strani OdNekdajLepeSoLjubljankeSlovele ni preveč pametno poenostaviti v OdNeLeSoLjSl, ker je ta verz pač uporabil že Prešeren.
Ob tem dodaja še nekaj zlatih pravil: pomembnih gesel ne reciklirajmo. Nič ni narobe, če imamo isto geslo za obskurne forume, zagotovo pa za e-bančništvo, elektronsko pošto, digitalni certifikat ipd. potrebujemo unikatna gesla. Takih gesel v resnici ni treba prav pogosto menjati (definitivno ne na 90 dni, kot želijo nekatere strani). Pomembneje je, da ne uporabljamo raznih varnostnih vprašanj za obnovitev gesel. Namesto tega raje uporabimo upravljalnik gesel in omogočimo dvostopenjsko avtentikacijo, kadar je podprta.
Entropija
Matematično poizkusimo kakovost gesel kvantificirati z entropijo. Kadar generiramo naključno, je entropija posameznega gesla z dolžino v enaka log2n bitov. Naključno osemmestno geslo, za katerega vemo (spomnimo se, da je entropija nujno antropocentrična količina, kar je uvid statistične fizike), da je izbrano iz samih malih črk angleške abecede, ima entropijo 37,6 bita (ker je 237,6 = 268). To geslo ima večjo entropijo, če je naključno izbrano iz nabora malih in velikih črk, a po naključju vsebuje samo male črke.
Toda ljudje nismo številski stroji. V internetu pogosto citiran zgled dobrega gesla (v stripu XKCD pod številko 936) correcthorsebatterystaple ima v resnici entropijo zgolj 44 bitov (244 = 20484), če upoštevamo, da gre za štiri angleške besede, izbrane iz slovarja z 2048 najpogostejšimi. Tudi če niso izbrane iz tega slovarja, to ni pomembno, saj ta slovar zadostuje za zlom tega gesla. Če po drugi strani o tem geslu vemo le to, da gre za angleške besede, ima entropijo 88 bitov, ki jo izračunamo iz frekvenčne porazdelitve pogostnosti pojavljanja posameznih zaporedij besed v angleščini.
Kaj sledi iz tega? Predvsem to, da se ne smemo zanašati na razne spletne pripomočke, ki nam za vneseno geslo izračunajo njegovo jakost oziroma entropijo. Ti namreč običajno ne vedo nič o naprednih napadih, zato entropijo ocenijo previsoko. Geslo radteimam namreč še zdaleč ni tako varno, kot nas želijo prepričati angleško govoreči analizatorji.
Upravljalniki gesel
Izmišljevati in zapomniti si dobra gesla je težko. Na pomoč nam priskočijo upravljalniki gesel (password manager), ki ti dve funkciji opravljajo za nas. Zapomniti si moramo zgolj glavno geslo (master password), ki mora biti res močno. Splača se vam vložiti nekaj truda, da si zapomnite 20 naključnih črk in številk, ki bodo predstavljale glavno geslo. To bo ščitilo vsa ostala gesla, ki bodo še močnejša, a si jih bo za vas izmislil in zapomnil upravljalnik gesel. To je trenutno najvarnejši način za delo z gesli, ki mu seveda lahko dodamo dvostopenjsko avtentikacijo.
LastPass. Eden najbolj priljubljenih brezplačnih upravljalnikov gesel je LastPass, ki je sicer na voljo tudi v različici premium, a ni zastonj. Toda za rabo doma zadošča tudi brezplačna, čeprav 12 dolarjev na leto za polno različico res ni veliko. V LastPass se prijavimo z elektronskim naslovom in močnim geslom, ki si ga ustvarimo sami. LastPass se ob namestitvi ugnezdi v najpogostejše brskalnike (Internet Explorer, Firefox, Chrome, Safari, Opera, Maxthon, neuradno pa še SeaMonkey, Pale Moon in Epic) in ko pridemo na spletno stran, kjer moramo vpisati geslo, nam ponudi tvorjenje varnega gesla, ki si ga potem tudi zapomni. Geslo si lahko izberemo tudi sami, LastPass si ga bo prav tako zapomnil. Nato nam bo vsakokrat, ko bomo stran obiskali, avtomatično vpisal prijavne podatke. Če želimo, lahko določene strani zaklenemo tako, da moramo ob obisku vpisati glavno geslo za LastPass (master password), LastPass pa bo potem vnesel pravo geslo za tisto stran. Vklopimo lahko tudi večstopenjsko avtentikacijo.
Ponuja tudi varne zapiske, ki so prav tako dostopni le z geslom. Dobrodošla funkcija je tudi analiza gesel, saj nas opominja na podvojena gesla (enaka na različnih straneh) in zelo šibka gesla. LastPass ponuja tudi sinhronizacijo gesel med napravami, a v brezplačni različici le med istovrstnimi (namiznimi računalniki ali pametnimi telefoni ali tablicami). Omogoča celo deljenje gesel, saj lahko drugemu uporabniku LastPassa dovolimo, da za določeno spletno stran uporabi naše geslo. In da, hekerji so junija 2015 LastPassu ukradli kar nekaj gesel uporabnikov. Zlomiti jim jih ni uspelo, kar priča o dobrem šifriranju.
V resnici je LastPass za 99 odstotkov uporabnikov povsem zadovoljiv, saj ponuja vse, kar potrebujemo. Kljub temu omenimo še odprtokodno konkurenco.
KeePass. Odprtokodni KeePass je že bolj oskubljen, saj nima funkcije za avtomatično shranjevanje gesel, ki jih vnesemo na spletni strani. V KeePass jih moramo vpisati ročno ali skopirati, zna pa jih prebrati iz praktično vseh drugih upravljalnikov gesel. Ko prispemo na spletno stran, KeePass sicer ne zmore samodejno izpolniti polj za vnos gesel, zna pa simulirati pritiske tipk po tipkovnici, tako da geslo dejansko vpiše (simulira vpis uporabniškega imena, pritisk tabulatorja, vpis gesla in pritisk vnašalke). Zaporedje lahko tudi spremenimo ali na primer dodamo kakšen ukaz, kot je čakanje nekaj milisekund na naložitev druge strani.
LastPass nas opozori na recikliranje gesel.KeePass poleg glavnega gesla (master password) omogoča identifikacijo z datoteko (key file) ali uporabniškim računom na Windows (to je nevarno, če se vam Windows razsuje) ter različne kombinacije teh treh. KeePass lahko nastavimo tako, da se vanj vpisujemo na zavarovanem namizju, podobno kot User Account Control, s čimer preprečimo delovanje keyloggerjem. Ker KeePass gesel ne hrani v oblaku temveč šifrirane krajevno, je sinhronizacija možna ročno s kopiranjem datoteke z gesli. KeePass ni tako enostaven ali ličen kakor LastPass, je pa odprtokoden, robusten in predvsem od vseh najbolj nastavljiv.
KeePass je videti precej primitivno, a se le zdi tako.
Ruska stran Rambler.ru je leta 2012 izgubila gesla 100 milijonov uporabnikov, ki so bila shranjena v besedilni obliki.
Upravljalnikov gesel je še cel kup, vsi pa ponujajo bolj ali manj podobne funkcije. Tisti, ki iz kakšnega razloga ne bi bil zadovoljen z LastPassom ali KeePassom, lahko preizkusi še Dashlane, Sticky Password, LogMeOnce, RoboForm ali kakšnega drugega.
Lomljenje gesel
Za učinkovito lomljenje gesel moramo imeti (posoljene) zgoščene vrednosti krajevno dostopne v zbirki, s katero lahko počnemo karkoli. V tem primeru jo lahko podvržemo vsakršni računski moči, ki jo imamo. Časi naivnega lomljena s surovo silo, kjer bi po vrsti preizkušali vse možne kombinacije črk in številk, so minili. Poglejmo, kako bi v praksi potekal poizkus lomljenja gesel, če bi imeli pred seboj zbirko z 20.000 gesli v zgoščeni vrednosti MD5 brez soli, kar je slabo, a žal vse prepogosto.
Če se omejimo na 95 pogostih znakov ASCII (26 velikih črk, 26 malih črk, 10 števk, 33 posebnih simbolov), imamo na voljo 742.912.017.120 kombinacij za šest- in manjmestna gesla,, ki jih na normalni grafični kartici zlomimo v kakšni uri. Implikacija tega je zelo pomembna – kako posamezna spletna stran shranjuje gesla, ne moremo vedeti, zato moramo privzeti, da površno. Torej z zgoščevalnim algoritmom, ki je hiter. V takem primeru nobeno šestmestno ali krajše geslo ni varno. Pri tako kratkih geslih se niti ni vredno ukvarjati s slovarskimi napadi. Te uporabimo šele za lomljenje daljših gesel.
Sedem- in osemmestna gesla poizkusimo zlomiti z isto metodo, le da se omejimo le na male črke, to je 216.858.874.752 kombinacij. Potem pogledamo gesla z največ 12 znaki, ki pa so izključno številke. Takih ni veliko, jih je pa vedno nekaj – rojstni datumi ipd. Potem sledijo bolj zapletena ugibanja oziroma tako imenovani slovarski napadi. Na voljo so velikanski seznami najpogosteje uporabljenih gesel, besed, fraz. Dopolnimo jih lahko s hibridnim napadom, kjer gesla sestavljamo iz slovarskega dela in poizkušanja vseh možnih kombinacij. Tak napad na primer ugane geslo passwordNRC ali 1945germany. Soroden ja napad z masko, ki je v osnovi napad s surovo silo, le da upoštevamo, kako ljudje tvorijo gesla. Prvi znaki so verjetno velike črke, na koncu pa so števke ali simboli. Če to upoštevamo, lahko veliko 10-mestnih gesel zlomimo s samo 2.376.275.200.000 kombinacijami (521 * 264 * 105), kar je izvedljivo.
V tem trenutku bomo verjetno uganili kakšno polovico vseh gesel. To je že dovolj za statistično analizo, katere simbole uporabljajo uporabniki najpogosteje. To pomeni, da smo začeli uporabljati specifične, od strani odvisne prijeme. Z matematično metodo verigo Markova lahko izvedemo pametni ali ciljani napad s surovo silo, kjer še vedno preverimo vse možne kombinacije gesel, le da za vsako mesto ne preverjamo vseh znakov. Velike črke so pogosteje na začetku, male v sredini in številke na koncu. S tem občutno zmanjšamo prostor in zlomimo presenetljivo število daljših gesel (recimo do 10 znakov).
Od tu naprej postane lomljenje odvisno od tega, kje smo dobili gesla. Gesla pornografske strani bodo verjetno drugačna od tistih za e-bančništvo. Vse to lahko izkoristimo z naprednimi metodami. PACK (Password Analysis and Cracking Toolkit) je orodje, ki analizira že zlomljena gesla in išče vzorce.
S temi metodami lahko zlomimo gesla, ki jih samo s surovo silo ne bi nikoli in za katera bi naivno pričakovali, da so varna. Toda allineedislove, ilovemySister31 ali iloveyousomuch so enostavno zlomljiva, kažejo realni podatki.
Za lomljenje gesel, torej izračunavanje zgoščenih vrednosti, se danes uporabljajo grafični procesorji. Ti so izjemno hitri, saj lahko za najhitrejše algoritme (npr. MD5 ali Microsoftov NTLM) ena kartica prečeše 10 in več milijard kombinacij na sekundo. Vse našteto velja tudi za posoljene zgoščene vrednosti, saj lomljenje posameznega gesla ni nič počasnejše. Edina razlika je le ta, da ne vemo, kdo vse ima isto geslo. In rešitev? Počasen algoritem za zgoščevanje (npr. bcrypt).
Omenimo še mavrične tabele, ki zelo pospešijo lomljenje gesel, shranjenih z nekaterimi zgoščenimi vrednostmi. Če želimo preizkusiti vse možne kombinacije gesel, ne potrebujemo praktično nič prostora na disku, a veliko računske moči oziroma časa. In nasprotno – če bi imeli izračunane zgoščene vrednosti vseh kombinacij za gesla, bi jih samo primerjali, a toliko prostora nimamo. Ne mi, ne nihče drug na tem svetu.
Mavrične tabele so odličen kompromis. Tvorimo jih tako, da za vsako možno geslo iz nabora (nabor podaja dolžino in dopustne znake ter morebitne druge pogoje) izračunamo zgoščeno vrednost. Potem to zgoščeno vrednost podvržemo redukcijski funkciji, ki vrne nekaj geslu podobnega. Ne gre za inverzno funkcijo od zgoščevalne funkcije, ker so slednje narejene tako, da je nimajo. Redukcijska funkcija vrne neko drugo zaporedje znakov enake vrste, kakor so na voljo v naslovnem prostoru, od koder črpamo znake za preverjanje gesel. V najenostavnejšem primeru je lahko redukcijska funkcija enostavno taka, da obdrži le prvih n znakov zgoščene vrednosti. Iz tega novega gesla spet izračunamo zgoščeno vrednost, jo spet reduciramo in postopek ponavljamo. Na koncu v tabelo shranimo le prvo točko (prvo geslo) in zadnjo točko (zadnjo zgoščeno vrednost).
Mavrične tabele omogočajo uporabo predizračunanih podatkov za lomljenje gesel.
Pri lomljenju gremo v nasprotni smeri. Imamo zgoščeno vrednost gesla, zato najprej v mavrični tabeli preverimo, ali jo imamo že zapisano. Če je nimamo, zgoščeno vrednost reduciramo in znova zgostimo (ker redukcijska funkcija ni inverz, ne bomo prispeli do iste zgoščene vrednosti). Pogledamo, ali imamo to zgoščeno vrednost v mavrični tabeli, drugače postopek ponovimo. Ko najdemo ustrezno zgoščeno vrednost, preberemo pripadajočo prvo točko (začetno geslo) in geslo zgoščujemo in reduciramo, dokler ne pridemo do iskane želene vrednosti. Redukcija neposredno pred njo je geslo. Seveda imajo mavrične tabele pomanjkljivosti, saj niso izčrpne (odvisno od naslovnega prostora, nad katerim so bili izračunane). Problem so tudi kolizije, saj lahko različne verige pripeljejo do istih vrednosti. A načeloma so velikanske mavrične tabele omogočila lomljenje gesel v obsegu kot še nikoli prej. V zameno za žrtvovanje prostora na disku (ki je poceni) dobimo nakopičeno znanje iz milijard milijard procesorskih ciklov.
Incidenti
O največjih vdorih sicer pišemo v sosednjem članku, kjer se nismo omejevali pri podatkih, ki so jih vdiralci odnesli. Po navadi namreč odnesejo kakšne elektronske naslove in podobno, do (zgoščenih) gesel pridejo redkeje. Nekaj takih primerov pa se je kljub temu zgodilo in prav ti so poskrbeli, da imamo danes še izčrpnejše slovarje in mavrične tabele.
Ruska stran Rambler.ru je leta 2012 izgubila gesla 100 milijonov uporabnikov, ki so bila shranjena v besedilni obliki (plaintext). Podobno se je leta 2016 zgodilo še eni ruski strani, in sicer VKontakte. Ameriški oglaševalec ClixSense je lani izgubil 6,6 milijona gesel, spet nešifriranih. Leto prej je 000Webhost, ki je najbolj priljubljen ponudnik brezplačnega gostovanja, izgubil 13 milijonov nešifriranih gesel. To so zgolj največji primeri, ko so se izgubila gesla, ki niso bila zgoščena, kar je nedopustna varnostna malomarnost.
Primerov, ko so ukradli zgoščena gesla, je na tone in jih niti ne moremo vseh našteti. Povejmo le, da so vdirali in uporabniške podatke kradli že z Yahooja, AOLa, Forbesa in še marsikatere druge strani. Kadar so bila šibko zavarovana, so jih veliko večino sorazmerno hitro zlomili in prodali na črnem trgu.
Zato še enkrat ponovimo – ne reciklirajte gesel, temveč raje uporabljajte upravljalnike gesel. Nikoli se namreč ne ve, kdaj bodo vdrli v kakšno storitev, do katere dostopate z geslom. Za varen izbor lastnega gesla lahko poskrbimo, nimamo pa prav nobenega vpliva na varnostno politiko ponudnika storitve. Če ta gesla hrani v besedilni obliki ali kot zgoščeno vrednost MD5 brez soli (tudi gesla Windows NT in XP hranijo z zlomljeno zgoščevalno funkcijo brez soli), vam še tako premeteno izbrano geslo ne pomaga. Je rešitev gesla odpraviti?
Ko gesel ne bo več
Gesla niso edini način dokazovanja identitete. Ponekod je že danes mogoče vstopiti drugače (v e-Davke, recimo, vstopimo z digitalnim potrdilom), številni izdelovalci in ponudniki storitev pa razvijajo načine za odpravo gesel. Dvostopenjska avtentikacija ni nadomestilo gesel v pravem pomenu, temveč zgolj njihova nadgradnja, saj poleg gesla potrebujemo še dostop do druge naprave, navadno pametnega telefona za prijavo.
Svojo identiteto lahko izkazujemo na tri načine: z nečim, kar vemo, imamo ali smo. Pri geslih gre za prvo možnost, saj geslo moramo vedeti. V internetu jih uporabljamo zato, ker so bila na začetku povsem dovolj dobra za svoj namen, zdaj pa gre za staro stanje, za katero v resnici tudi še ni enostavne alternative.
Druga možnost je virtualni žeton (token), ki nam ga dodeli spletna stran in s katerim se identificiramo. Gre za naključno generirano zaporedje, s katerim se predstavimo strežniku. Ker si ga izmisli strežnik, je daljše in varnejše od gesel, prav tako ni nevarnosti, povezanih z reciklažo gesel. Zato se, recimo, žetoni v strežniku lahko hranijo kar kot zgoščene vrednosti. Primer je, recimo, koda QR, ki nam jo izpiše aplikacija WhatsApp na računalniškem zaslonu in jo moramo posneti s kamero na pametnem telefonu, da ju sparimo.
Tretja možnost je biometrija, kjer preverjamo, kar smo. Klasični načini identificiranja so prstni odtisi, šarenica in prepoznavanja obraza, razvijajo pa se čedalje bolj eksotični. Google je lani začel eksperimentalno razvijati alternative, med katerimi najdemo poleg oblike obraza in barve glasu tudi način hoje, način tipkanja in celo drsenja (swipe) po zaslonu na pametnem telefonu. Načeloma lahko ljudi prepoznamo tudi po DNK, a to je za zdaj še znanstvena fantastika.
Vsem biometričnim identifikatorjem je skupna bistvena pomanjkljivost – sorazmerno nespremenljivi so. Ukradena gesla ali žetone lahko razveljavimo, prstnih odtisov pa si ne moremo spremeniti. Če nam jih kdo prekopira, bo z njimi lahko odprl vsa vrata, ki jih odpiramo tudi sami.
Morda bomo v prihodnosti gesla ponekod res nadomestili. Toda upamo si trditi, da bo vsaj v naslednjem desetletju ali dveh dostop večinoma reguliran z njimi. Zato z gesli po pameti!
Komentarji
Wega | 1.9.2017 | 09:46
Odličen članek, hvala!
itsi | 10.10.2017 | 19:32
Res super. Upam, da kje predavate.