Bcrypt vs Argon2: kateri hash gesla leta 2026

Bcrypt in Argon2 sta funkciji zgoščevanja besed najbolj uporabljena gesla danes. Oba sta zasnovana tako, da sta počasna in odporna na Napadi s surovo silo, za razliko od MD5 ali SHA-256, ki so po konstrukciji hitri. Argon2a zmagal na tekmovanju za zgoščevanje gesel leta 2015 in je zdaj priporočena izbira OWASP za nove aplikacije. Bcrypt ostaja odlična, zrela in široko podprta izbira. to Ta članek natančno pojasnjuje razlike, da vam pomaga pri odločitvi.

Zakaj je zgoščena vrednost gesla drugačna

Klasično kriptografsko zgoščevanje, kot je SHA-256, je zasnovano tako, da je hitro: želimo zgoščevati GB podatkov na sekundo. Za gesla je ta lastnost privzeta: napadalec ki pridobi vašo tabelo uporabnikov, lahko preizkusi milijarde gesel na sekundo na a GPU. Funkcija zgoščevanja gesel (PHF) si nasprotno prizadeva biti:

  • Počasna konstrukcija, s prilagodljivim parametrom stroškov
  • Salty, za preprečevanje mavričnih tabel in vzporednih napadov na več računov
  • Odporen na specializirano strojno opremo (GPU, FPGA, ASIC) za omejevanje tekmovalne pospešitve

Parameter soli in stroškov sta shranjena z zgoščeno vrednostjo, običajno v enem nizu v obliki $algo$params$sel$hash. To omogoča, da se stroški sčasoma povečajo brez vsili takojšnjo selitev starih zgoščenih vrednosti.

Bcrypt: 1999, Blowfish, stroškovni parameter

Bcrypt sta leta 1999 oblikovala Niels Provos in David Mazières za OpenBSD. Je temelji na šifrirnem algoritmu Blowfish, katerega izkorišča visoke stroške inicializacije mize. Bcrypt izpostavi en sam parameter, cost (ali rounds), ki definira število ponovitev v obliki 2^strošek. Povečanje stroškov za 1 podvoji čas izračuna.

Tipičen izhodni format:

$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
 |  |  |                      |
 |  |  cena = 12 soli + hash v base64
 |  različica (2y = openbsd)
 algo bcrypt

Bcrypt omeji vnos na 72 bajtov: daljše geslo se tiho skrajša, kar je znana past. Običajna rešitev je predhodno zgoščevanje s SHA-256 in nato kodiranje base64 bcrypt, vendar lahko to pri nekaterih izvedbah povzroči problematične ničelne bajte. Argon2 nima te meje.

Argon2: 2015, zmagovalec PHC, 3 variante

Argon2 so oblikovali Alex Biryukov, Daniel Dinu in Dmitry Khovratovich. Ima julija zmagal na tekmovanju za zgoščevanje gesel 2015 in je standardiziran z RFC 9106 (2021). Argon2 izpostavlja tri parametre:

  • Stroški pomnilnika (m): količina uporabljenega pomnilnika v KiB
  • Časovni stroški (t): število ponovitev v pomnilniškem bloku
  • Vzporednost (p): število vzporednih niti

Argon2 obstaja v treh različicah:

  • Argon2d: dostop do pomnilnika, odvisen od podatkov. Bolj odporen na napade GPE, vendar dovzeten za napade stranskih kanalov (čas, predpomnilnik).
  • Argon2i: dostop do pomnilnika, neodvisen od podatkov. Odporen na stranske kanale, nekoliko manj odporen na napade GPU.
  • Argon2id: hibrid, začne se v načinu i in nato preklopi v način d. Privzeto priporočeno z RFC 9106 in OWASP.

Parametri, ki jih leta 2026 priporoča OWASP za Argon2id: m=19456 KiB (19 MiB), t=2, p=1. Tipičen izhodni format:

$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
 |         |   |                  |                 |
 |         |   parametri soli base64 base64 hash
 |         različica
 algo argon2id

Zakaj se priporoča Argon2id

Odpornost na specializirano opremo je danes odločilno merilo. Bcrypt uporablja malo pomnilnik (~4 KiB), ki omogoča vrhunskemu grafičnemu procesorju, da testira več sto tisoč zgoščenih vrednosti na sekundo. Argon2id je pomnilniški: prisilite več MiB pomnilnika na poskus drastično zmanjša vzporednost, ki jo je mogoče doseči na GPU, in omogoča oblikovanje namenskih ASIC-jev ekonomsko nedonosna.

Hibridni način Argon2id dodatno zagotavlja zaščito pred napadi stranskega kanala v prvi polovici izračuna. Prav ta kombinacija upravičuje svoje mesto Privzeto priporočilo iz OWASP, NIST SP 800-63B (od revizije 2024) in RFC 9106.

Primerjalna tabela

Merilo Bcrypt Argon2id
Leto19992015
StandardizacijaDe facto, USENIX 1999RFC 9106 (2021)
Parametricenapomnilnik, čas, vzporednost
Uporabljen pomnilnik~4 KiBNastavljivo (priporočeno ~19 MiB)
S pomnilnikomNeDa
Odpornost GPEZmernaMočna
Odpornost stranskega kanalaDobro (konstanten čas)Dobro (način ID)
Omejitev vnosa72 bajtovBrez
Priporočilo OWASP 2026SprejemljivoZaželeno
Zrelost ekosistemaZelo širokoŠiroko od ~2018

Zmogljivost in odpornost na napade

Na sodobnem strežniku bcrypt pri ceni = 12 traja približno 250 ms in argon2id s parametri OWASP približno 100-300 ms, odvisno od stroja. Absolutni čas ni merilo: tisto, kar šteje, je razmerje med vašimi stroški (en izračun, enkrat na prijavo) in stroški napadalca (milijarde izračuni na GPU za prekinitev odlagališča).

Na RTX 4090 hashcat doseže približno 200.000 bcrypt/s pri ceni = 12 v primerjavi z nekaj desetinami na tisoče argon2id pri 19 MiB. Za enak čas izračuna na strani strežnika se Argon2id upočasni napadalec 5- do 10-krat več kot bcrypt, vrzel pa se z novicami povečuje generacije grafičnih procesorjev.

Primeri PHP

PHP podpira izvorno prek password_hash() in password_verify() od PHP 7.2 za Argon2i (in 7.3 za Argon2id). Konstruktor PHP upravlja sol in format samodejno.

Bcrypt

$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
$ok = password_verify($geslo, $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,
    'niti' => 1,
];
$hash = password_hash($geslo, PASSWORD_ARGON2ID, $opts);
$ok = password_verify($geslo, $hash);

if (password_needs_rehash($hash, PASSWORD_ARGON2ID, $opts)) {
    $hash = password_hash($geslo, PASSWORD_ARGON2ID, $opts);
}

Z našimi lahko ustvarite ali identificirate zgoščene vrednosti vseh vrst generator zgoščenih vrednosti in naš hash identifikator.

Priporočilo

Za novo aplikacijo leta 2026 izberite Argon2id z nastavitvami OWASP kot izhodišče (m=19456, t=2, p=1), ki se prilagodi glede na ciljni čas (običajno 250 do 500 ms). Če vzdržujete obstoječo aplikacijo v bcrypt, jo selitev ni nujna: bcrypt po ceni = 12 ali več ostane varen v letu 2026. Izkoristite password_needs_rehash() ob naslednji prijavi za postopno selitev uporabnikov sredstva za Argon2id.

Absolutno se izogibajte MD5, SHA-1 in golemu SHA-256 za gesla (glejte naše primerjava MD5 proti SHA-256). Noben od teh algoritmov ni zasnovan za to uporabo.

Pogosta vprašanja

Ali je Bcrypt leta 2026 še varen?

Da, pod pogojem, da uporabljate zadostno ceno (najmanj 12, 14, če je mogoče). Bcrypt nima znana kriptografska napaka. Njegova edina slabost v primerjavi z Argon2id je majhen odtis pomnilnik, zaradi česar je bolj dostopen napadom GPU in FPGA.

Ali naj preselimo bazo podatkov bcrypt v Argon2id?

Ne nujno. Pristop je postopna selitev s password_need_rehash() priporočljivo: ob vsaki uspešni prijavi znova zgoščite geslo v Argon2id. Na koncu nekaj mesecev je večina aktivnih uporabnikov preseljenih in lahko prisilite a ponastavitev za mirujoče račune.

Kakšno je pravo število niti za Argon2id?

OWASP privzeto priporoča p=1. Povečanje p ne naredi nič, če vaš spletni strežnik že obdeluje veliko zahtev vzporedno in otežuje nastavitev. Določite prednost namesto povečanja m (pomnilnika), ki je glavni vzvod odpornosti GPE.

Kaj je »bcrypt decrypter«?

Ni dekriptorja bcrypt: funkcija je po konstrukciji enosmerna. Orodja ki trdijo, da "dešifrirajo" bcrypt, samo preizkušajo slovarje gesel tokovi proti hashu. To je popolnoma enako, kot če bi napadalec imel vašo mizo.

Argon2i ali Argon2id?

Argon2id v vseh primerih za gesla. Argon2i je nekoliko več varen pred stranskimi kanali, vendar šibkejši pred napadi GPE. Argon2id združuje prednosti obeh in ga RFC 9106 izrecno priporoča za zgoščevanje gesel.

Ali naj poleg soli dodamo še poper?

Sol zadostuje za veliko večino aplikacij. Poper (skrivni ključ, shranjen zunaj baze podatkov in se uporablja kot HMAC pred zgoščevanjem) doda plast v primeru uhajanja baze podatkov brez ogrožanja aplikacijskega strežnika. Argon2id ga ne zagotavlja izvorno, mora biti pokličite ročno.