Bcrypt vs Argon2: ce hash de parolă în 2026

Bcrypt și Argon2 sunt cele două funcții de hashing de parole cele mai utilizate astăzi. Ambele sunt concepute să fie lente și rezistente atacurilor prin forță brută, contrar MD5 sau SHA-256 care sunt rapide prin construcție. Argon2 a câștigat Password Hashing Competition în 2015 și este de acum alegerea recomandată de OWASP pentru noile aplicații. Bcrypt rămâne o alegere excelentă matură și larg suportată. Acest articol explică precis diferențele pentru a te ajuta să tranșezi.

De ce un hash de parolă este diferit

Un hash criptografic clasic precum SHA-256 este conceput să fie rapid: se vrea hashing-ul a Gb de date pe secundă. Pentru parole, această proprietate este un defect: un atacator care recuperează tabelul tău de utilizatori poate testa miliarde de parole pe secundă pe un GPU. O funcție de hashing de parolă (PHF, password hashing function) caută dimpotrivă să fie:

  • Lentă prin construcție, cu un parametru de cost ajustabil
  • Sărată, pentru a împiedica rainbow tables și atacurile paralele pe mai multe conturi
  • Rezistentă hardware-ului specializat (GPU, FPGA, ASIC) pentru a limita speedup-ul adversarial

Sarea și parametrul de cost sunt stocate cu hash-ul, într-un șir unic tipic sub forma $algo$params$sare$hash. Aceasta permite creșterea costului în timp fără a forța migrarea imediată a vechilor hash-uri.

Bcrypt: 1999, Blowfish, parametru cost

Bcrypt a fost conceput de Niels Provos și David Mazières pentru OpenBSD în 1999. Este bazat pe algoritmul de criptare Blowfish, al cărui cost ridicat de inițializare a tabelelor îl exploatează. Bcrypt expune un singur parametru, cost (sau rounds), care definește numărul de iterații sub forma 2^cost. Creșterea cost-ului cu 1 dublează timpul de calcul.

Format de ieșire tipic:

$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
 |  |  |                      |
 |  |  cost = 12               sare + hash în base64
 |  variantă (2y = openbsd)
 algo bcrypt

Bcrypt limitează intrarea la 72 de octeți: o parolă mai lungă este trunchiată silențios, ceea ce este o capcană cunoscută. Soluția obișnuită este să pre-hashuiești cu SHA-256 apoi să codezi în base64 înainte de bcrypt, dar aceasta poate introduce null byte-uri problematici pe anumite implementări. Argon2 nu are această limită.

Argon2: 2015, câștigător PHC, 3 variante

Argon2 a fost conceput de Alex Biryukov, Daniel Dinu și Dmitry Khovratovich. A câștigat Password Hashing Competition în iulie 2015 și este standardizat prin RFC 9106 (2021). Argon2 expune trei parametri:

  • Memory cost (m): cantitate de memorie utilizată, în KiB
  • Time cost (t): număr de iterații pe blocul de memorie
  • Parallelism (p): număr de thread-uri paralele

Argon2 există în trei variante:

  • Argon2d: acces la memorie dependent de date. Mai rezistent atacurilor GPU, dar sensibil atacurilor pe canal auxiliar (timing, cache).
  • Argon2i: acces la memorie independent de date. Rezistent side-channel-urilor, ușor mai puțin rezistent atacurilor GPU.
  • Argon2id: hibrid, demarează în mod i apoi basculează în mod d. Recomandat implicit de RFC 9106 și OWASP.

Parametrii recomandați de OWASP în 2026 pentru Argon2id: m=19456 KiB (19 MiB), t=2, p=1. Format de ieșire tipic:

$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
 |         |   |                  |                 |
 |         |   parametri           sare base64       hash base64
 |         versiune
 algo argon2id

De ce Argon2id este recomandat

Rezistența hardware-ului specializat este astăzi criteriul decisiv. Bcrypt utilizează puțină memorie (~4 KiB), ceea ce permite unui GPU de gamă înaltă să testeze sute de mii de hash-uri pe secundă. Argon2id este memory-hard: forțarea mai multor MiB de memorie per încercare reduce drastic paralelismul atins pe GPU și face conceperea de ASIC-uri dedicate economic nerentabilă.

Modul hibrid al Argon2id oferă în plus o protecție contra atacurilor pe canal auxiliar în timpul primei jumătăți a calculului. Este această combinație care îi justifică locul de recomandare implicită al OWASP, NIST SP 800-63B (din revizia 2024) și RFC 9106.

Tabel comparativ

Criteriu Bcrypt Argon2id
An19992015
StandardizareDe facto, USENIX 1999RFC 9106 (2021)
Parametricostmemory, time, parallelism
Memorie utilizată~4 KiBConfigurabil (~19 MiB recomandat)
Memory-hardNuDa
Rezistență GPUModeratăPuternică
Rezistență side-channelBună (constant-time)Bună (mod id)
Limită de intrare72 octețiNiciuna
Recomandare OWASP 2026AcceptabilăPreferată
Maturitate ecosistemFoarte largăLargă din ~2018

Performanță și rezistență la atacuri

Pe un server modern, un bcrypt la cost=12 durează aproximativ 250 ms și un argon2id cu parametrii OWASP aproximativ 100-300 ms în funcție de mașină. Timpul absolut nu este criteriul: ceea ce contează este raportul între costul tău (un calcul, o dată per login) și cel al atacatorului (miliarde de calcule pe GPU pentru a sparge un dump).

Pe un RTX 4090, hashcat atinge aproximativ 200 000 bcrypt/s la cost=12, contra câteva zeci de mii de argon2id la 19 MiB. Pentru același timp de calcul pe partea serverului, Argon2id încetinește atacatorul de 5 până la 10 ori mai mult decât bcrypt, iar diferența se adâncește cu noile generații de GPU.

Exemple PHP

PHP suportă ambele nativ prin password_hash() și password_verify() din PHP 7.2 pentru Argon2i (și 7.3 pentru Argon2id). Constructorul PHP gestionează sarea și formatul automat.

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);
}

Poți genera sau identifica hash-uri de toate tipurile cu generatorul nostru de hash și identificatorul nostru de hash.

Recomandare

Pentru o aplicație nouă în 2026, alege Argon2id cu parametrii OWASP ca baseline (m=19456, t=2, p=1), de ajustat în funcție de timpul țintă (tipic 250 până la 500 ms). Dacă menții o aplicație existentă în bcrypt, nu există urgență de migrare: bcrypt la cost=12 sau mai mult rămâne sigur în 2026. Profită de un password_needs_rehash() la următorul login pentru a migra progresiv utilizatorii activi spre Argon2id.

Evită absolut MD5, SHA-1 și SHA-256 simplu pentru parole (vezi comparativul nostru MD5 vs SHA-256). Niciunul dintre acești algoritmi nu este conceput pentru această utilizare.

Întrebări frecvente

Este Bcrypt încă sigur în 2026?

Da, cu condiția să utilizezi un cost suficient (12 minim, 14 dacă posibil). Bcrypt nu are slăbiciune criptografică cunoscută. Singura sa slăbiciune relativă față de Argon2id este amprenta sa slabă de memorie, ceea ce îl face mai accesibil atacurilor GPU și FPGA.

Trebuie să migrez o bază bcrypt spre Argon2id?

Nu în urgență. O migrare progresivă cu password_needs_rehash() este abordarea recomandată: la fiecare login reușit, re-hashuiești parola în Argon2id. După câteva luni, majoritatea utilizatorilor activi sunt migrați, și poți forța o resetare pentru conturile latente.

Care este numărul bun de thread-uri pentru Argon2id?

OWASP recomandă p=1 implicit. Creșterea lui p nu aduce nimic dacă serverul tău web tratează deja multe cereri în paralel, și complică tuning-ul. Privilegiază mai degrabă creșterea lui m (memorie) care este pârghia principală de rezistență GPU.

Ce este un "bcrypt decrypter"?

Nu există decrypter bcrypt: funcția este unidirecțională prin construcție. Instrumentele care pretind că "decriptează" bcrypt nu fac decât să testeze dicționare de parole curente contra hash-ului. Este exact același lucru ca un atacator care ar avea tabelul tău.

Argon2i sau Argon2id?

Argon2id în toate cazurile pentru parole. Argon2i este ușor mai sigur față de side-channel-uri dar mai slab față de atacurile GPU. Argon2id combină avantajele celor doi și este explicit recomandat de RFC 9106 pentru hashing-ul parolelor.

Trebuie să piperezi (pepper) pe lângă sare?

Sarea este suficientă pentru marea majoritate a aplicațiilor. Un piper (cheie secretă stocată în afara bazei de date și utilizată ca HMAC înainte de hash) adaugă un strat în caz de scurgere a bazei fără compromiterea serverului aplicativ. Argon2id nu îl furnizează nativ, trebuie compus manual.