Jak ukládáme hesla

Ne příliš dobře. V šestistupňové škále kvality uložení hesel dle Password storage disclosures rating guide jsme na předposledním místě. Hesla se ukládají hašovaná pomocí algoritmu NThash*, který používá kryptografickou hašovací funkci** MD4 s jednou iterací a bez soli.

Proč používáme takto slabý algoritmus pro ukládání hesel?

Zvolený způsob hašování vychází z dostupných metod v protokolu komunikace mezi koncovým zařízením (notebook, mobil, …) a autentizačním serverem (Radius server). Extensible Authentication Protocol (EAP) podporuje větší množství metod, ale jsme omezeni implementacemi v jednotlivých operačních systémech. Existují pouze dvě v praxi použitelná řešení:

  • Vytvoření šifrovaného tunelu PEAP či TTLS a uvnitř autentizovat pomocí protokolu MSCHAPv2. V tomto případě na serveru mohou být hesla uložena nezašifrovaná či zašifrovaná pomocí algoritmu NThash.
  • Vytvoření šifrovaného tunelu a autentizace uživatele pomocí certifikátu – metoda EAP-TLS.

Většina ostatních metod předpokládá buď uložení hesla na serveru nezašifrovaná (EAP-pwd, FAST-GTC, TTLS-GTC) nebo se heslo posílá nezašifrované uvnitř tunelu (TTLS-PAP), což by usnadnilo útoky Man-in-the-Middle. Větším problémem je, že žádná z těchto dalších metod není podporována ve všech používaných operačních systémech (Windows, macOS, Linux, Android, IOS).

Jaké jsou nevýhody algoritmu NThash?

Algoritmus NThash je velmi rychlý, což znamená že útočník může velmi rychle otestovat velké množství hesel. A protože se nepoužívá sůl, tak otestování konkrétní varianty hesla u 10 000 uživatelů trvá přibližně dvojnásobek času proti otestování stejné varianty hesla u jednoho uživatele. S jedinečnou solí by to trvalo 10 000 krát déle.

Příklad:
Nechť uživatelé používají náhodné heslo složené z 9 znaků – malá, velká písmena a číslice. Útočník se zmocní 10 000 těchto hesel uložených pomocí NThash. Rychlost lámání závisí na zařízení, které má útočník k dispozici. V následující tabulce máte přibližnou dobu v hodinách, za jakou získá 1 libovolné heslo (chce se přihlásit za libovolného uživatele), heslo 1 konkrétního uživatele (chce se přihlásit za jednoho konkrétního uživatele) a všech 10 000 hesel:

Zařízení Rychlost lámání 1 libovolné heslo 1 konkrétní heslo 10 000 hesel
CPU (4 jádra) 4,65E+07 H/s 8,09 hod 40 436,83 hod 80 873,66 hod
GPU Nvidia GTX 1080 4,37E+10 H/s 0,01 hod 43,00 hod 86,00 hod
Sagitta Brutalis 3,51E+11 H/s 0,00 hod 5,36 hod 10,71 hod

V prvním a možná i ve druhém případě pro útočníka bude výhodnější si stáhnout předpřipravené duhové tabulky např. z http://project-rainbowcrack.com/table.htm (690GB soubor), neboť pomocí nich získá všechna hesla v průběhu jednoho dne.

Nevhodnost algoritmu NThash vynikne při porovnání se způsobem uložení hesel ve studijním systému. Zde se používá hašovací algoritmus sha512crypt s náhodnou solí a se 12345 iteracemi. V následující tabulce vycházím ze stejných předpokladů jako u předchozí tabulky: 9-znaková náhodná hesla z malých, velkých písmen a číslic. Upozorňuji, že doba je uvedena v rocích, ne v hodinách.

Zařízení Rychlost lámání 1 libovolné heslo 1 konkrétní heslo 10 000 hesel
CPU (4 jádra) 627 H/s 342 147 roků 342 147 roků 3 421 474 561 roků
GPU Nvidia GTX 1080 62 505 H/s 3 434 roků 3 434 roků 34 337 909 roků
Sagitta Brutalis 525 870 H/s 408 roků 408 roků 4 081 410 roků

Díky soli zde není rozdíl v získání jednoho libovolného hesla a jednoho konkrétního hesla.

Doporučení pro uživatele

Úspěšnost lámání lze omezit dvěma způsoby.

Prodloužením hesla. U 13 znakového náhodného hesla z malých písmen a číslic by útočník na grafické kartě získal první libovolné heslo za 108 hodin. Doporučujeme heslo složit z více slov. Za relativně bezpečná lze považovat uživatelem vytvářená hesla delší než 15 znaků.

Použití českých znaků či znaků z jiných abeced (v eduroam lze použít libovolné znaky z UTF-8). Pro tato hesla nejsou předpřipravené tabulky. Pokud se v 9 znakovém náhodném heslu použijí i malá písmena české abecedy, tak se doba lámání prodlouží 4x. Za relativně bezpečná lze považovat hesla s diakritikou s délkou od 13 znaků. POZOR – zkontrolujte si, že jste schopni zadat znaky s diakritikou na všech svých zařízeních.

Poznámky

Funkce pro výpočet NThash vypadá takto:

NThash = MD4( UTF-16-LE( password ))

Kryptografická hašovací funkce jednosměrně převádí vstup na výsledný hašový kód pevné délky (u MD4 je to 128 bitů). Jednosměrnost znamená, že je výpočetně nezvládnutelné zjistit vstup z výsledného haše. Kryptografické hašovací funkce ještě musí být odolné vůči kolizím, ale to u hesel nemá větší význam.

  • Autor: Luboš Pavlíček
  • Vytvořeno:
  • Poslední aktualizace: