Ako weby (snáď) ukladajú naše heslá, aby neunikla na verejnosti i pri úniku dát
Keď sa registrujeme k nejakej online službe, nech je to e-mailová schránka, e-shop alebo napríklad fórum, zvyčajne si pri registrácii musíme zvoliť nejaké heslo, pomocou ktorého sa následne prihlasujeme. Mohli by sme si povedať, že administrátori daného webu sa potom jednoducho môžu pozrieť do svojej databázy a ihneď vidieť, aké sme si zvolili heslo. Našťastie existujú metódy, ako tomuto predísť, aby ani majitelia webov a databáz heslo nepoznali, ale ide vždy o dôveryhodnosť daného webu.
Ako by teda mala služba ukladať kombinácii nášho prihlasovacieho mena a hesla, aby všetko bolo pokiaľ možno čo najviac zabezpečené?
📝Obsah
Prečo online služby neukladajú heslá v pôvodnom tvare
Uložiť heslo v pôvodnom tvare sa zdá ako najjednoduchšie možnosť. Ak si nejaký web so zabezpečením nerobí hlavu, tak to dokonca aj presne takto robí. Trocha práce navyše je ale aj v záujme webov, ktoré prijímajú registrácie. Pri úniku dát, ktorý sa jednoducho môže stať, by mohol daný web mať zásadné problémy, pretože nedokázal dáta dostatočne zabezpečiť a zašifrovať.
Ako by teda malo správne zabezpečenia aspoň v princípe vyzerať? Je pravda, že si toto nemôžeme vždy overiť, ale môžeme spať s trochu pokojnejším vedomím toho, že sa naša hesla (aspoň obvykle) nepovaľujú na weboch v pôvodnom tvare (niekedy sa tomuto nezašifrovanému tvaru hovorí plain text).
Heslá sa uchovávajú v šifrovanom tvare
Najskôr začnime trochu zoširoka. Základom šifrovanie hesiel za účelom ich uchovanie je takzvaná haš funkcie. Tá funguje jednoducho tak, že zadáme nejaký vstup (teda potrebné zadané heslo, ale principiálne môže ísť o akýkoľvek text), pomocou matematického vzorca sa tieto dáta zašifrujú a my dostaneme nejaký výstup, ktorý sa úplne nijako nepodobá pôvodnému tvaru heslá a v praxi ide o na prvý pohľad úplne náhodný hlúčik znakov, ktorému hovoríme hash (čítaj haš).
- Príklad vytvorenie jednoduchého hashe: Ako vstup našej hashovacie funkcia musí byť prvočíslo a náš matematický vzorec je, že toto prvočíslo odmocníme a vezmeme 5. až 10. desatinné miesto, ktoré navyše ešte napíšeme pospiatky. Ak si vezmeme kalkulačku a spočítame si odmocninu z prvočísla 3, tak dostaneme výsledok 1.7320508075 … Ak by sme vzali 5. až 10. desatinné číslo (zvýraznené vo výsledku), tak dostaneme 508075, a podľa našej vymyslené funkcie ho ešte prevrátime, takže získame 570805, čo je náš výsledný hash.
Princíp je taký, že hashovacie funkcia by mala vyzerať tak, že je pomerne veľmi jednoduché previesť vstup na výstup, ale (ideálne) nemožné odvodiť z výsledného výstupu, aký bol pôvodný vstup. Keby sme poznali iba výstup 815780, tak by sme dosť zložito prichádzali na to, že pôvodne zadané prvočíslo bolo 9973. Síce presne vieme, ako hash odvodiť, tak prísť na pôvodnú prvočíslo v praxi znamená, že musíme jednoducho skúšať a skúšať, než na výsledok prídeme.
S výpočtovým výkonom dnešných počítačov by to bola otázka chvíľky, ale ide nám skôr o princíp fungovania. Matematické funkcie, ktoré premieňajú vstupné heslo na hash sú výrazne komplikovanejšie a sú schopné zvládať ľubovoľný vstup, teda nie len prvočísla, ako tomu bolo v príklade. Rôzne hashovacie metódy a ako výsledné hashe vyzerajú, si môžete vyskúšať napríklad tu. Dôležitá podmienka hashe je aj jeho nepredvídateľnosť. Zmena jediného znaku vo vstupe by mala vytvoriť úplne inak vyzerajúce výstup.
Načo to všetko bolo?
Teraz sme si ukázali, ako aspoň principiálne zašifrovať nejaký text na hash. Pri uchovávaní hesiel je toto absolútne kľúčové. Ak si totiž niekde založíme účet s heslom, tak sa toto heslo zašifruje do tvaru, z ktorého je nemožné získať pôvodný heslo.
Vždy, keď sa potom prihlasujeme, tak sa nami zadané heslo zašifruje identickú matematickú formulkou a porovná sa so zašifrovanú verziou uloženú v databáze. Ak sa došlo k rovnakému výsledku, teda je heslo rovnaké, ako bolo zadané pri registrácii, tak je prihlásenie úspešné.
Výsledné heslo sa tak nikdy nemusí uchovávať v databáze v pôvodnom tvare. Stačí poznať výsledný hash a funkciu, pomocou ktorej sa k tomuto výsledku došlo. Aj pri znalosti funkcie ale nemožno spätne heslo odvodiť. Toto uchovávanie hesiel má tú výhodu, že pri úniku dát pozná hacker len výsledný hash, a nie samotné heslo. Prelomiť hash by malo byť rovnako náročné, ako snaha o uhádnutie hesla samotného, takže sa útočníkom vlastne ani veľmi neoplatí to skúšať. Ďalšia výhoda je tá, že ani majitelia webe naše heslo nepoznajú a zo svojej databázy ho nezistí.
Hashovanie nemusí ochrániť pred slovníkovým útokom – čo takto heslo osoliť?
O tom, čo je slovníkový útok, sme písali tu. V skratke ide o typ útoku hrubou silou, kedy sa útočník snaží prísť na naše heslo skúšaním. Slovníkový útok je ale oveľa sofistikovanejšie metóda, pretože neskúša heslá úplne náhodne, ale využíva znalosti a tendencií. Ako heslá teda útočník, respektíve jeho softvér, skúša bežné slová, ale aj informácie, ktoré pozná o majiteľovi účtu, ktorý chce prelomiť.
Problém s hashováním je ten, že niektorí používatelia používajú rovnaké heslá. A ak na rovnaké heslo použijeme rovnaký spôsob zahashování, tak nám vyjde aj rovnaký hash. Ak by sa teda útočník dostal k databáze hesiel, tak môže porovnať, či u niektorých užívateľov nenájde rovnako zašifrované heslá, pretože títo používatelia používajú heslo rovnaké. Slovníkový útok je tiež zákerný v tom, že si útočník môže pomocou rovnakej metódy zahashování vytvoriť tieto šifry pre najpoužívanejšie hesla, takže pre neho potom nie je problém len porovnať svoj zoznam známych hash s heslami, ktoré nájde v databáze. Zjednodušene povedané, ani hashovanie nezabráni útočníkovi, aby prišiel na najpoužívanejšie hesla.
A teraz prichádza na rad ďalší stupeň zabezpečenia, ktorému sa hovorí salted hash, teda v preklade osolený hash. Táto metóda funguje tak, že ku každému heslu sa pred zahashováním pridá nejaký náhodný reťazec znakov. Tento reťazec môže byť pokojne verejný, niekto používa ako tento reťazec napríklad prihlasovacie meno užívateľa.
Reťazec by ale mal byť rozdielny pre každého užívateľa (preto použitie prihlasovacieho mena tak dobre funguje). Pri hashovanie záleží aj na zmene jediného znaku, ktorý vyprodukuje celkom iný hash. Tým, že pred zahashováním k heslu niečo pridáme, tak je aj výsledný hash úplne iný a úplne nepredvídateľný. Aj používatelia, ktorí používajú identická heslá, budú mať svoje heslá zašifrované pod iným hashom. U legitímneho prihlasovanie sa potom akurát k heslu pridá daný salt, a až potom sa overí uložený hash.
Použitie salt tak lepšie chráni pred slovníkovými útokmi, pretože ak útočník nevie, kam a dokonca ani či bol salt použitý, tak ani nemôže ľahko overiť, aká rovnaká heslá používatelia používajú. Môže samozrejme skúšať pridávať náhodne verejný salt k známym heslám, ale je to pre neho veľa práce navyše. hoci nejde o vyložene nepriestrelnú ochranu, útočník bude pravdepodobne minimálne odradený od toho sa pokúšať heslá rozkľúčovať, a bude mať celkovo veľmi zložitú úlohu na to prísť z hashe aj na tie najpoužívanejšie hesla.
Nikdy poriadne nepoznáme zabezpečenia webov
Pozor ale na to, že takzvane pod kapotu fungovanie webov ako používatelia vlastne nikdy nevidíme. Ak služba používa šifrovanie, alebo nie, sa vlastne nemáme moc ako dozvedieť. Druhý problém je v tom, že aj šifrovacie metódy sa časom môžu prelomiť. Čo dnes vyzerá ako nemožné, sa môže raz matematicky vyriešiť tak, že je pre hackerov ľahké prísť na pôvodný tvar hashe.
Ide jednoducho len o ďalšiu vrstvu zabezpečenia účtov a našich hesiel, ale ani šifrovanie nie všespásné a vždy je možné, že aj tak heslá uniknú nejakým iným spôsobom, alebo že dané hashe budú časom prelomené. Ak tak zistíme, že z nejakej služby, ktorú používame, unikla dáta, mali by sme na tejto službe zmeniť heslo aj všetky heslá, ktorá sa podobajú tomuto, ktoré uniklo, aj keď napríklad v zašifrovanej podobe.