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
Rok19992015
ŠtandardizáciaDe facto, USENIX 1999RFC 9106 (2021)
Parametrecostmemory, time, parallelism
Použitá pamäť~4 KiBKonfigurovateľná (~19 MiB odporúčaná)
Memory-hardNieÁno
GPU odolnosťStrednáSilná
Side-channel odolnosťDobrá (constant-time)Dobrá (id mód)
Vstupný limit72 bajtovŽiadny
OWASP 2026 odporúčanieAkceptovateľnýPreferovaný
Vyzretosť ekosystémuVeľ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.