Hašovanie hesiel
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:
- Každý používateľský záznam ukladá svoj aktuálny hash algoritmus, parametre, soľ a hash.
- Pri prihlásení overte oproti uloženému hashu s jeho pôvodnými parametrami.
- 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.