Bcrypt vs Argon2: aký password hash v 2026
Bcrypt a Argon2 sú dve dnes najpoužívanejšie password hashing funkcie. Obe sú navrhnuté byť pomalé a odolné proti útokom hrubou silou, na rozdiel od MD5 alebo SHA-256, ktoré sú konštrukčne rýchle. Argon2 vyhral Password Hashing Competition v 2015 a je teraz voľba odporúčaná OWASP pre nové aplikácie. Bcrypt zostáva výbornou vyzretou a široko podporovanou voľbou. Tento článok presne vysvetľuje rozdiely, aby vám pomohol rozhodnúť.
Prečo je password hash odlišný
Klasický kryptografický hash ako SHA-256 je navrhnutý byť rýchly: chceme hashovať GB dát za sekundu. Pre heslá je táto vlastnosť nedostatkom: útočník, ktorý získa vašu tabuľku užívateľov, môže testovať miliardy hesiel za sekundu na GPU. Password hashing function (PHF) hľadá naopak byť:
- Pomalá konštrukciou, s nastaviteľným cost parametrom
- Solená, aby zabránila rainbow tables a paralelným útokom na viac účtov
- Odolná špecializovanému hardware (GPU, FPGA, ASIC) na obmedzenie adversariálneho speedupu
Soľ a cost parameter sú uložené s hashom v unikátnom reťazci typicky
formy $algo$params$sol$hash. To umožňuje zvýšiť cost s časom bez
nutnosti okamžitej migrácie starých hashov.
Bcrypt: 1999, Blowfish, cost parameter
Bcrypt bol navrhnutý Nielsom Provosom a Davidom Mazièresom pre OpenBSD v 1999. Je
založený na šifrovacom algoritme Blowfish, ktorého vysoký inicializačný cost
tabuliek využíva. Bcrypt exponuje jediný parameter, cost (alebo rounds), ktorý definuje
počet iterácií vo forme 2^cost. Zvýšenie costu o 1 zdvojnásobuje dobu výpočtu.
Typický výstupný formát:
$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
| | | |
| | cost = 12 sol + hash v base64
| variant (2y = openbsd)
algo bcrypt
Bcrypt obmedzuje vstup na 72 bajtov: dlhšie heslo je ticho oríznuté, čo je známa pasť. Obvyklý protiťah je predhashovať SHA-256, potom kódovať v base64 pred bcryptom, ale to môže zaviesť problematické null byty na niektorých implementáciách. Argon2 tento limit nemá.
Argon2: 2015, víťaz PHC, 3 varianty
Argon2 bol navrhnutý Alexom Biryukovem, Danielom Dinu a Dmitryem Khovratovichem. Vyhral Password Hashing Competition v júli 2015 a je štandardizovaný RFC 9106 (2021). Argon2 exponuje tri parametre:
- Memory cost (
m): množstvo použitej pamäte, v KiB - Time cost (
t): počet iterácií na pamäťovom bloku - Parallelism (
p): počet paralelných threadov
Argon2 existuje v troch variantoch:
- Argon2d: pamäťový prístup závislý od dát. Viac odolný GPU útokom, ale citlivý na útoky postranným kanálom (timing, cache).
- Argon2i: pamäťový prístup nezávislý od dát. Odolný side-channels, mierne menej odolný GPU útokom.
- Argon2id: hybridný, štartuje v móde i, potom prechádza do módu d. Defaultne odporúčaný RFC 9106 a OWASP.
Parametre odporúčané OWASP v 2026 pre Argon2id: m=19456 KiB (19 MiB),
t=2, p=1. Typický výstupný formát:
$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
| | | | |
| | parametre sol base64 hash base64
| verzia
algo argon2id
Prečo je Argon2id odporúčaný
Odolnosť proti špecializovanému hardware je dnes rozhodujúce kritérium. Bcrypt používa málo pamäte (~4 KiB), čo umožňuje high-end GPU testovať stovky tisíc hashov za sekundu. Argon2id je memory-hard: vynucovanie niekoľkých MiB pamäte per pokus drasticky znižuje paralelizmus dosiahnuteľný na GPU a robí návrh dedikovaných ASIC ekonomicky nerentabilným.
Hybridný mód Argon2id navyše ponúka ochranu proti útokom postranným kanálom počas prvej polovice výpočtu. Je to táto kombinácia, ktorá ospravedlňuje jeho miesto defaultného odporúčania OWASP, NIST SP 800-63B (od revízie 2024) a RFC 9106.
Porovnávacia tabuľka
| Kritérium | Bcrypt | Argon2id |
|---|---|---|
| Rok | 1999 | 2015 |
| Štandardizácia | De facto, USENIX 1999 | RFC 9106 (2021) |
| Parametre | cost | memory, time, parallelism |
| Použitá pamäť | ~4 KiB | Konfigurovateľná (~19 MiB odporúčaná) |
| Memory-hard | Nie | Áno |
| GPU odolnosť | Stredná | Silná |
| Side-channel odolnosť | Dobrá (constant-time) | Dobrá (id mód) |
| Vstupný limit | 72 bajtov | Žiadny |
| OWASP 2026 odporúčanie | Akceptovateľný | Preferovaný |
| Vyzretosť ekosystému | Veľmi široká | Široká od ~2018 |
Výkon a odolnosť útokom
Na modernom serveri bcrypt s cost=12 trvá približne 250 ms a argon2id s OWASP parametrami približne 100-300 ms podľa stroja. Absolútny čas nie je kritérium: počíta sa pomer medzi vaším costom (jeden výpočet, raz per login) a útočníkovým (miliardy výpočtov na GPU na prelomenie dumpu).
Na RTX 4090 dosahuje hashcat približne 200 000 bcrypt/s pri cost=12, oproti niekoľko desiatkam tisíc argon2id pri 19 MiB. Pre rovnaký výpočtový čas na strane servera spomaľuje Argon2id útočníka 5 až 10krát viac ako bcrypt a rozdiel rastie s novými generáciami GPU.
PHP príklady
PHP natívne podporuje obe cez password_hash() a password_verify()
od PHP 7.2 pre Argon2i (a 7.3 pre Argon2id). PHP konštruktor spravuje soľ a formát
automaticky.
Bcrypt
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
$ok = password_verify($password, $hash);
if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) {
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
}
Argon2id
$opts = [
'memory_cost' => 19456, // 19 MiB
'time_cost' => 2,
'threads' => 1,
];
$hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
$ok = password_verify($password, $hash);
if (password_needs_rehash($hash, PASSWORD_ARGON2ID, $opts)) {
$hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
}
Hashe všetkých typov môžete generovať alebo identifikovať naším generátorom hashov a naším identifikátorom hashov.
Odporúčanie
Pre novú aplikáciu v 2026 vyberte Argon2id s OWASP parametrami
ako baseline (m=19456, t=2, p=1), na úpravu podľa
cieľového času (typicky 250 až 500 ms). Ak udržiavate existujúcu aplikáciu v bcrypte,
nie je urgentné migrovať: bcrypt pri cost=12 alebo viac zostáva bezpečný v 2026. Využite
password_needs_rehash() pri ďalšom logine na postupnú migráciu aktívnych
užívateľov na Argon2id.
Absolútne sa vyhnite MD5, SHA-1 a holému SHA-256 pre heslá (viď naše porovnanie MD5 vs SHA-256). Žiadny z týchto algoritmov nie je navrhnutý pre toto použitie.
Často kladené otázky
Je bcrypt stále bezpečný v 2026?
Áno, za podmienky použitia dostatočného costu (12 minimum, 14 ak je to možné). Bcrypt nemá známu kryptografickú trhlinu. Jeho jediná relatívna slabosť voči Argon2id je nízka pamäťová stopa, ktorá ho robí prístupnejším GPU a FPGA útokom.
Je potrebné migrovať bcrypt databázu na Argon2id?
Nie urgentne. Postupná migrácia s password_needs_rehash() je odporúčaný
prístup: pri každom úspešnom logine re-hashujete heslo na Argon2id. Po
niekoľkých mesiacoch je väčšina aktívnych užívateľov migrovaná a môžete vynútiť
reset pre spiace účty.
Aký je správny počet threadov pre Argon2id?
OWASP odporúča p=1 defaultne. Zvýšenie p neprináša nič, ak váš
webový server už spracováva veľa paralelných požiadaviek a komplikuje tuning. Preferujte
skôr zvýšenie m (pamäť), čo je hlavná páka GPU odolnosti.
Čo je "bcrypt decrypter"?
Bcrypt dešifrátor neexistuje: funkcia je konštrukčne jednosmerná. Nástroje, ktoré tvrdia, že "dešifrujú" bcrypt, iba testujú slovníky bežných hesiel proti hashu. Je to presne to isté ako útočník, ktorý by mal vašu tabuľku.
Argon2i alebo Argon2id?
Argon2id vo všetkých prípadoch pre heslá. Argon2i je mierne bezpečnejší voči side-channels, ale slabší voči GPU útokom. Argon2id kombinuje výhody oboch a je explicitne odporúčaný RFC 9106 na hashovanie hesiel.
Je potrebné pepperovať navyše k saltu?
Soľ stačí pre veľkú väčšinu aplikácií. Pepper (tajný kľúč uložený mimo databázy a použitý ako HMAC pred hashom) pridáva vrstvu v prípade úniku databázy bez kompromitácie aplikačného servera. Argon2id ho neposkytuje natívne, treba ho komponovať manuálne.