import bcrypt from 'bcrypt';
import argon2 from 'argon2';
async function loginAndMigrate(user, passwordInput) {
const isArgonHash = user.passwordHash.startsWith('$argon2');
if (isArgonHash) {
// Verificare standard modernă
return await argon2.verify(user.passwordHash, passwordInput);
}
// Userul încă are hash-ul vechi (bcrypt)
const isBcryptMatch = await bcrypt.compare(passwordInput, user.passwordHash);
if (isBcryptMatch) {
// Parola e corectă, facem upgrade silențios în background
const newHash = await argon2.hash(passwordInput, {
memoryCost: 65536,
timeCost: 3,
parallelism: 4
});
await db.updateUserPassword(user.id, newHash);
return true;
}
return false;
}Hai să vorbim pe șleau despre stocarea parolelor în 2026. Încă văd în audituri proiecte noi care pleacă la drum cu MD5 sau SHA256 simplu, ori mai rău, cu bcrypt setat la un cost factor de 10, lăsat așa din inerție din 2015.
Am avut acum un an un proiect cu vreo 80k useri activi unde a trebuit să regândim complet zona asta de securitate. Ne-am lovit direct de dilema clasică: rămânem pe bătrânul bcrypt sau facem trecerea la Argon2id? Răspunsul nu e atât de simplu pe cât vor să te facă să crezi tutorialele de pe net.
Bcrypt vs Argon2id în 2026
Bcrypt a fost regele mult timp și încă își face treaba decent dacă e configurat corect. Problema lui este că e optimizat doar împotriva atacurilor pe CPU. În schimb, atacatorii folosesc astăzi GPU-uri masive sau cipuri ASIC dedicate. Aici intervine Argon2id (câștigătorul Password Hashing Competition și recomandarea oficială OWASP).
Argon2id este un algoritm "memory-hard". Asta înseamnă că nu cere doar timp de calcul de la procesor, ci blochează și o cantitate specifică de memorie RAM. Pentru un atacator care vrea să spargă milioane de hash-uri în paralel pe un GPU, lipsa de memorie RAM pe cip devine un blocaj fizic masiv.
Dar există un trade-off sincer aici. Dacă rulezi aplicația pe un VPS ieftin de 5$ cu 1GB RAM total, Argon2id s-ar putea să-ți îngenuncheze serverul. La un simplu atac de tip brute-force pe endpoint-ul de login, serverul tău va rămâne fără RAM și va da crash instant (Out of Memory). Bcrypt e mult mai iertător cu resursele serverului tău, chiar dacă e teoretic mai slab în fața unui atacator cu bugete mari.
Parametrii corecți (Cost Factors)
Regula de aur pentru hashing-ul de parole este simplă: procesul trebuie să dureze între 100ms și 300ms pe hardware-ul tău de producție. Mai rapid de atât înseamnă că e prea ușor de spart; mai lent înseamnă că îți blochezi propriul server la orele de vârf.
Dacă folosești bcrypt, în 2026 cost factor-ul minim acceptabil este 12. Sub valoarea asta, un cluster de GPU-uri moderne îți va sparge parolele slabe în câteva ore. Pe un procesor de server mediu, cost 12 înseamnă cam 250ms de calcul.
Dacă mergi pe Argon2id, nu folosi setările default din librării fără să le testezi. O configurare sigură și echilibrată pentru un server web standard este:
- Memorie (
m): 65536 KB (64MB) - Sesiuni/Timp (
t): 3 iterații - Paralelism (
p): 4 thread-uri (ajustat în funcție de câte nuclee ai libere)
Cum migrezi gradual (fără resetări de parole)
Cea mai mare greșeală pe care o poți face este să trimiți un mail de tipul "Ne-am updatat sistemul, vă rugăm să vă resetați parolele". Userii urăsc asta și vei pierde clienți. Migrarea se face silențios, pe măsură ce userii se loghează în mod legitim.
Strategia e simplă: când un user introduce parola corectă, verifici dacă hash-ul din baza de date folosește algoritmul vechi (bcrypt). Dacă da, validezi parola cu bcrypt, apoi generezi imediat un hash nou folosind Argon2id și suprascrii valoarea în baza de date.
După 6-12 luni, o să ai peste 90% din userii activi migrați pe noul algoritm. Pentru restul de 10% (conturi inactive), poți decide ulterior dacă le blochezi contul până la o resetare prin email.
Tu ce folosești în producție în momentul ăsta? Ai făcut trecerea la Argon2id sau bcrypt e încă destul de bun pentru ce ai nevoie?