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 |
|---|---|---|
| Rok | 1999 | 2015 |
| Standardizace | De facto, USENIX 1999 | RFC 9106 (2021) |
| Parametry | cost | memory, time, parallelism |
| Použitá paměť | ~4 KiB | Konfigurovatelná (~19 MiB doporučeno) |
| Memory-hard | Ne | Ano |
| GPU odolnost | Střední | Silná |
| Side-channel odolnost | Dobrá (constant-time) | Dobrá (id mód) |
| Vstupní limit | 72 bajtů | Žádný |
| OWASP 2026 doporučení | Akceptovatelný | Preferovaný |
| Vyzrálost ekosystému | Velmi š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ě.