password••••••••Argon2id+salt + cost$argon2id$v=19$m=...$Tk7e...slow, memory-hard, one-way

Hašovanie hesiel

11 min prečítanéKryptografia

Ukladanie používateľských hesiel je jednou z najhorších vecí, ktoré môžete urobiť v obyčajnom texte, a jednou z najčastejších bezpečnostných chýb. Oprava existuje už desaťročia – hashovanie hesiel pomocou pomalých, pamäťovo náročných algoritmov – ale rozdiel medzi dobrými a zlými implementáciami je obrovský a väčšina únikov údajov odhaľuje zlé možnosti.

Celé telo článku je uvedené v angličtine nižšie.

Hášovanie hesla je postup ukladania jednosmernej transformácie hesla používateľa namiesto hesla samotného. Keď sa používateľ prihlási, rovnaká transformácia sa použije na jeho vstup a porovná sa s uloženou hodnotou. Ak dôjde k narušeniu uloženej databázy, útočník má k dispozícii hash, nie heslá – a obnovenie originálov by malo byť výpočtovo nemožné.

To je teória. Prax sa pohybuje od „funguje tak, ako je inzerované“ po „možno to bol aj obyčajný text“, v závislosti od zvoleného algoritmu a parametrov.

Čo potrebuje dobrý hash hesla

  • Jednosmerný. heslo.
  • Salted. Každý používateľ má do hashu primiešanú jedinečnú náhodnú soľ. Zabraňuje vopred vypočítaným dúhovým tabuľkám a zaisťuje, že identické heslá vytvárajú rôzne hash.
  • Slow. Jediný výpočet hash by mal na útočnom hardvéri trvať zmysluplný zlomok sekundy. Hrubá sila v miliardách za sekundu je to, čo porazí rýchle hash.
  • Pamäťová tvrdá. Každý hash by mal vyžadovať značnú pamäť RAM, čím porazí paralelizáciu GPU a ASIC, ktorej sa darí na malej pamäti na inštanciu.
  • Funkcie hardvéru by mali byť vylepšené ako 27 nákladové parametre. rýchlejšie.

Nesprávne voľby

Algoritmy, ktoré nikdy nesmiete použiť na ukladanie hesiel:

  • MD5. Kryptograficky nefunkčné od roku 2004. Brutálne vynútiteľné miliardy sekúnd na desať hardvér.
  • SHA-1, SHA-256. Rýchle kryptografické hash určené na kontrolu integrity, nie na ukladanie hesiel. Brutálne vynútiteľné pri miliardách za sekundu na GPU.
  • Zašifrované heslá. Ak ich dokážete dešifrovať späť na čistý text, dokáže to aj útočník, ktorý ukradne kľúč. Hašovanie je odpoveď; šifrovanie nie je.
  • Plaintext. Stále sa to stane aj v roku 2026. Každému narušeniu hesla vo forme čistého textu sa dá predísť.

Správne možnosti

Tri moderné odporúčané algoritmy:

  • bcrypt (1999). Nastaviteľný nákladový faktor (koly výpočtu). Obmedzené na 72-bajtové heslá. Nie je náročný na pamäť, takže GPU naň môžu efektívne útočiť – ale primeraný nákladový faktor stále robí útoky drahými. Široké nasadenie, jednoduché správne používanie.
  • scrypt (2009). Ťažké na pamäť. Konfigurovateľné náklady na pamäť, paralelizmus a náklady na CPU. Zložitejšie ako bcrypt; niekedy zle nakonfigurovaný.
  • Argon2 (víťaz súťaže o hasenie hesiel za rok 2015). Tri varianty: Argon2d (závislý od údajov, odolný voči útokom GPU, ale zraniteľný voči bočným kanálom), Argon2i (nezávislý od údajov, odolný voči bočným kanálom), Argon2id (hybridný – odporúčané predvolené nastavenie). Moderné, dobre preverené, správna voľba pre nové systémy.

OWASP v súčasnosti odporúča Argon2id s pamäťou aspoň 19 MB, počtom iterácií 2 a paralelizmom 1. Pre systémy, kde nie je Argon2 k dispozícii, bcrypt s cenou ≥ 10 alebo scrypt s vhodnými parametrami 2xPLXX znamená záložný kód2X practice

Nákladový faktor 10 v bcrypt znamená približne 100 ms na hash na modernom hardvéri. Pre legitímne prihlásenie užívateľa je to nepostrehnuteľné. Pre útočníka, ktorý sa snaží brutálnym spôsobom vynútiť 100 miliónov hesiel z uniknutej databázy, je to 100 miliónov × 100 ms = 116 dní času GPU na jeden prechod cez rozumný zoznam slov. V kombinácii s jedinečnou soľou na používateľa sú veľké dúhové tabuľky zbytočné.

Pre rýchly hash, akým je neslaný SHA-256, rovnaká operácia trvá niekoľko minút na rovnakom hardvéri.

Manipulácia so soľou

    XNGPLZ81XSalt je generovaná používateľom tvorba
  • 16 bajtov je dostačujúcich (128 bitov náhodnosti)
  • Soľ je uložená spolu s hashom, nie je tajná – jej úlohou je byť jedinečná, neskrytá
  • Najmodernejšie hašovacie knižnice (bcrypt, Argon2) výstupy, parametre soli vo formáte PHCal a reťazec string

Pepper: voliteľné extra

A pepper je tajná hodnota pre celú lokalitu pridaná k vstupu hash, uložená oddelene od databázy (v HSM, trezore kľúčov alebo konfigurácii aplikácie). Ak je databáza vyhodená, ale korenie nie je, haše sú neobnoviteľné aj so soľou používateľa – pretože útočník korenie nemá. Pepper je užitočný doplnok na opasok a traky pre systémy s vysokou hodnotou.

Bezpečná inovácia hashov

Keď zmeníte parametre alebo migrujete algoritmy, nemôžete znova hašovať bez pôvodného hesla. Štandardný prístup:

  1. Každý používateľský záznam ukladá svoj aktuálny hash algoritmus, parametre, soľ a hash.
  2. Pri prihlásení overte oproti uloženému hashu s jeho pôvodnými parametrami.
  3. Ak overenie prebehne úspešne a parametre sú neaktuálne, zopakujte hash s aktuálnymi parametrami a aktualizujte záznam o niekoľko mesiacov1XXX9 vZPLX1. aktívnych používateľov sa databáza prepne na nové parametre bez vynútenia resetovania hesla.

    Čo to znamená pre používateľov

    Pre koncových používateľov to znamená praktický efekt: aj keď dôjde k narušeniu databázy, silné jedinečné heslo (spravované správcom hesiel ) a dobré heslo zostane efektívne tajné na serveri. Slabé heslá sa prelomia aj z dobre hashovaných databáz; užívateľ je premenná, ktorú vývojár nemôže ovládať.

Často kladené otázky

Prečo je bcrypt obmedzený na 72 znakov?
Podrobnosti o historickej implementácii základnej šifry Blowfish. Dlhšie vstupy budú skrátené. Väčšina používateľov si to nevšimne; 16-znaková náhodná prístupová fráza je hlboko pod limitom. Pre systémy, ktoré chcú neobmedzenú dĺžku hesla, Argon2 takéto obmedzenie nemá.
Mám svoje heslá osoliť a okoreniť?
Vyžaduje sa soľ (a každá renomovaná knižnica to robí automaticky). Korenie je voliteľné, ale cenné pre systémy s vysokým zabezpečením. Kompromis: správa papriky ako dlhodobého tajomstva mimo databázy zvyšuje prevádzkovú zložitosť. Väčšina aplikácií ukladá soľ + hash; tie najväčšie uchovávajú soľ + hash + hash odvodený od korenia.
Je Argon2 vždy lepší ako bcrypt?
Pre nové systémy áno. Argon2 je náročný na pamäť (odolný voči GPU/ASIC), nemá limit 72 znakov a vyhral súťaž Password Hashing Competition z dobrých dôvodov. bcrypt je stále prijateľné, keď nie je k dispozícii Argon2 alebo organizačné obmedzenia uprednostňujú starší štandard. Pre staršie systémy používajúce bcrypt s cenou ≥ 10 je naliehavosť migrácie nízka.
Ako dlho by malo trvať hashovanie hesla?
OWASP navrhuje okolo 100-500 ms na hardvéri servera. Rýchlejší znamená slabší proti útočníkom; pomalšie štarty ovplyvňujú legitímne prihlásenie. Správne číslo závisí od vašej návštevnosti – veľkoobjemové služby si vyberajú nižšie náklady; služby s vysokým zabezpečením s nízkou mierou prihlásenia si môžu vybrať vyššie.
Môžem ukladať heslá zašifrované namiesto hašovaných?
nie. Šifrovanie je reverzibilné, čo znamená, že šifrovací kľúč musí existovať niekde, kam má aplikácia prístup. Ak dôjde k porušeniu databázy, kľúč je často tiež a vy ste efektívne uložili čistý text. Ide o nezvratnosť hašovania – dokonca ani vaša vlastná aplikácia nedokáže obnoviť heslo, ktoré je bezpečnostnou vlastnosťou.
Vysvetlenie hashovania hesiel: Prečo na bcrypt, scrypt a Argon2 záleží