Bcrypt vs Argon2: jaký password hash v 2026

Bcrypt a Argon2 jsou dvě dnes nejpoužívanější password hashing funkce. Obě jsou navrženy být pomalé a odolné proti útokům hrubou silou, na rozdíl od MD5 nebo SHA-256, které jsou konstrukčně rychlé. Argon2 vyhrál Password Hashing Competition v 2015 a je nyní volba doporučovaná OWASP pro nové aplikace. Bcrypt zůstává výbornou vyzrálou a široce podporovanou volbou. Tento článek přesně vysvětluje rozdíly, aby vám pomohl rozhodnout.

Proč je password hash odlišný

Klasický kryptografický hash jako SHA-256 je navržen být rychlý: chceme hashovat GB dat za sekundu. Pro hesla je tato vlastnost nedostatkem: útočník, který získá vaši tabulku uživatelů, může testovat miliardy hesel za sekundu na GPU. Password hashing function (PHF) hledá naopak být:

  • Pomalá konstrukcí, s nastavitelným cost parametrem
  • Solená, aby zabránila rainbow tables a paralelním útokům na více účtů
  • Odolná specializovanému hardware (GPU, FPGA, ASIC) pro omezení adversariálního speedupu

Sůl a cost parametr jsou uloženy s hashem v unikátním řetězci typicky formy $algo$params$sůl$hash. To umožňuje zvýšit cost s časem bez nutnosti okamžité migrace starých hashů.

Bcrypt: 1999, Blowfish, cost parametr

Bcrypt byl navržen Nielsem Provosem a Davidem Mazièresem pro OpenBSD v 1999. Je založen na šifrovacím algoritmu Blowfish, jehož vysoký inicializační cost tabulek využívá. Bcrypt exponuje jediný parametr, cost (neboli rounds), který definuje počet iterací ve formě 2^cost. Zvýšení costu o 1 zdvojnásobuje dobu výpočtu.

Typický výstupní formát:

$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
 |  |  |                      |
 |  |  cost = 12               sůl + hash v base64
 |  varianta (2y = openbsd)
 algo bcrypt

Bcrypt omezuje vstup na 72 bajtů: delší heslo je tiše oříznuto, což je známá past. Obvyklý protitah je předhashovat SHA-256, pak zakódovat v base64 před bcryptem, ale to může zavést problematické null byty na některých implementacích. Argon2 tento limit nemá.

Argon2: 2015, vítěz PHC, 3 varianty

Argon2 byl navržen Alexem Biryukovem, Danielem Dinu a Dmitryem Khovratovichem. Vyhrál Password Hashing Competition v červenci 2015 a je standardizován RFC 9106 (2021). Argon2 exponuje tři parametry:

  • Memory cost (m): množství použité paměti, v KiB
  • Time cost (t): počet iterací na paměťovém bloku
  • Parallelism (p): počet paralelních threadů

Argon2 existuje ve třech variantách:

  • Argon2d: paměťový přístup závislý na datech. Více odolný GPU útokům, ale citlivý na útoky postranním kanálem (timing, cache).
  • Argon2i: paměťový přístup nezávislý na datech. Odolný side-channels, mírně méně odolný GPU útokům.
  • Argon2id: hybridní, startuje v módu i, pak přechází do módu d. Defaultně doporučený RFC 9106 a OWASP.

Parametry doporučené OWASP v 2026 pro 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
 |         |   |                  |                 |
 |         |   parametry           sůl base64        hash base64
 |         verze
 algo argon2id

Proč je Argon2id doporučený

Odolnost proti specializovanému hardware je dnes rozhodující kritérium. Bcrypt používá málo paměti (~4 KiB), což umožňuje high-end GPU testovat stovky tisíc hashů za sekundu. Argon2id je memory-hard: vynucování několika MiB paměti per pokus drasticky snižuje paralelismus dosažitelný na GPU a činí návrh dedikovaných ASIC ekonomicky nerentabilním.

Hybridní mód Argon2id navíc nabízí ochranu proti útokům postranním kanálem během první poloviny výpočtu. Je to tato kombinace, která ospravedlňuje jeho místo defaultního doporučení OWASP, NIST SP 800-63B (od revize 2024) a RFC 9106.

Srovnávací tabulka

Kritérium Bcrypt Argon2id
Rok19992015
StandardizaceDe facto, USENIX 1999RFC 9106 (2021)
Parametrycostmemory, time, parallelism
Použitá paměť~4 KiBKonfigurovatelná (~19 MiB doporučeno)
Memory-hardNeAno
GPU odolnostStředníSilná
Side-channel odolnostDobrá (constant-time)Dobrá (id mód)
Vstupní limit72 bajtůŽádný
OWASP 2026 doporučeníAkceptovatelnýPreferovaný
Vyzrálost ekosystémuVelmi širokáŠiroká od ~2018

Výkon a odolnost útokům

Na moderním serveru bcrypt s cost=12 trvá přibližně 250 ms a argon2id s OWASP parametry přibližně 100-300 ms podle stroje. Absolutní čas není kritérium: počítá se poměr mezi vaším costem (jeden výpočet, jednou per login) a útočníkovým (miliardy výpočtů na GPU pro prolomení dumpu).

Na RTX 4090 dosahuje hashcat přibližně 200 000 bcrypt/s při cost=12, oproti několika desítkám tisíc argon2id při 19 MiB. Pro stejný výpočetní čas na straně serveru zpomaluje Argon2id útočníka 5 až 10krát více než bcrypt a rozdíl roste s novými generacemi GPU.

PHP příklady

PHP nativně podporuje oba přes password_hash() a password_verify() od PHP 7.2 pro Argon2i (a 7.3 pro Argon2id). PHP konstruktér spravuje sůl 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šech typů můžete generovat nebo identifikovat naším generátorem hashů a naším identifikátorem hashů.

Doporučení

Pro novou aplikaci v 2026 vyberte Argon2id s OWASP parametry jako baseline (m=19456, t=2, p=1), k úpravě podle cílového času (typicky 250 až 500 ms). Pokud udržujete existující aplikaci v bcryptu, není urgentní migrovat: bcrypt při cost=12 nebo více zůstává bezpečný v 2026. Využijte password_needs_rehash() při dalším loginu pro postupnou migraci aktivních uživatelů na Argon2id.

Absolutně se vyhněte MD5, SHA-1 a holému SHA-256 pro hesla (viz naše srovnání MD5 vs SHA-256). Žádný z těchto algoritmů není navržen pro toto použití.

Často kladené otázky

Je bcrypt stále bezpečný v 2026?

Ano, za podmínky použití dostatečného costu (12 minimum, 14 pokud možno). Bcrypt nemá známou kryptografickou trhlinu. Jeho jediná relativní slabost vůči Argon2id je nízká paměťová stopa, která ho činí přístupnějším GPU a FPGA útokům.

Je třeba migrovat bcrypt databázi na Argon2id?

Ne urgentně. Postupná migrace s password_needs_rehash() je doporučený přístup: při každém úspěšném loginu re-hashujete heslo na Argon2id. Po několika měsících je většina aktivních uživatelů migrována a můžete vynutit reset pro spící účty.

Jaký je správný počet threadů pro Argon2id?

OWASP doporučuje p=1 defaultně. Zvýšení p nepřináší nic, pokud váš webový server již zpracovává mnoho paralelních požadavků, a komplikuje tuning. Preferujte spíše zvýšení m (paměť), což je hlavní páka GPU odolnosti.

Co je "bcrypt decrypter"?

Bcrypt dešifrátor neexistuje: funkce je konstrukčně jednosměrná. Nástroje, které tvrdí, že "dešifrují" bcrypt, pouze testují slovníky běžných hesel proti hashi. Je to přesně totéž jako útočník, který by měl vaši tabulku.

Argon2i nebo Argon2id?

Argon2id ve všech případech pro hesla. Argon2i je mírně bezpečnější vůči side-channels, ale slabší vůči GPU útokům. Argon2id kombinuje výhody obou a je explicitně doporučen RFC 9106 pro hashování hesel.

Je třeba pepperovat navíc k saltu?

Sůl stačí pro velkou většinu aplikací. Pepper (tajný klíč uložený mimo databázi a použitý jako HMAC před hashem) přidává vrstvu v případě úniku databáze bez kompromitace aplikačního serveru. Argon2id ho neposkytuje nativně, je třeba ho komponovat manuálně.