Bcrypt vs Argon2: hvilken adgangskode hash i 2026
Bcrypt og Argon2 er de to ord-hash-funktioner de mest brugte adgangskoder i dag. Begge er designet til at være langsomme og modstandsdygtige over for Brute force angreb, i modsætning til MD5 eller SHA-256, som er hurtige af konstruktion. Argon2a vandt Password Hashing Competition i 2015 og er nu det OWASP anbefalede valg til nye ansøgninger. Bcrypt forbliver et fremragende, modent og bredt understøttet valg. Dette Denne artikel forklarer forskellene præcist for at hjælpe dig med at beslutte.
Hvorfor en hash-kodeord er anderledes
En klassisk kryptografisk hash som SHA-256 er designet til at være hurtig: vi vil hash GB data per sekund. For adgangskoder er denne egenskab en standard: en angriber som henter din brugertabel kan teste milliarder af adgangskoder i sekundet på en GPU. En password hashing-funktion (PHF) søger derimod være:
- Langsom ved konstruktion med en justerbar omkostningsparameter
- Salt for at forhindre regnbueborde og parallelle angreb på flere konti
- Modstandsdygtig over for specialiseret hardware (GPU, FPGA, ASIC) for at begrænse modstandsdygtig hastighed
Salt- og prisparameteren gemmes med hashen, typisk i en enkelt streng
af formen $algo$params$sel$hash. Dette gør det muligt for omkostningerne at stige over tid uden
fremtvinge øjeblikkelig migrering af gamle hashes.
Bcrypt: 1999, Blowfish, omkostningsparameter
Bcrypt blev designet af Niels Provos og David Mazières til OpenBSD i 1999. Det er
baseret på Blowfish-krypteringsalgoritmen, som den udnytter de høje omkostninger ved initialisering af
borde. Bcrypt afslører en enkelt parameter, cost (eller rounds), som definerer
antal iterationer i formen 2^kost. Ved at øge omkostningerne med 1 fordobles beregningstiden.
Typisk outputformat:
$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
| | | |
| | pris = 12 salt + hash i base64
| variant (2y = openbsd)
algo bcrypt
Bcrypt begrænser input til 72 bytes: en længere adgangskode afkortes lydløst, hvilket er en kendt fælde. Den sædvanlige løsning er at pre-hash med SHA-256 og derefter base64-kode før bcrypt, men dette kan introducere problematiske null-bytes på nogle implementeringer. Argon2 har ikke denne grænse.
Argon2: 2015, PHC-vinder, 3 varianter
Argon2 er designet af Alex Biryukov, Daniel Dinu og Dmitry Khovratovich. Det har han vandt Password Hashing-konkurrencen i juli 2015 og er standardiseret af RFC 9106 (2021). Argon2 afslører tre parametre:
- Hukommelsesomkostninger (
m): mængden af brugt hukommelse i KiB - Tidsomkostninger (
t): antal iterationer på hukommelsesblokken - Parallelisme (
p): antal parallelle tråde
Argon2 findes i tre varianter:
- Argon2d: dataafhængig hukommelsesadgang. Mere modstandsdygtig over for GPU-angreb, men modtagelig for sidekanalangreb (timing, cache).
- Argon2i: datauafhængig hukommelsesadgang. Modstandsdygtig over for sidekanaler, lidt mindre modstandsdygtig over for GPU-angreb.
- Argon2id: hybrid, starter i mode i og skifter derefter til mode d. Anbefalet som standard af RFC 9106 og OWASP.
Parametrene anbefalet af OWASP i 2026 for Argon2id: m=19456 KiB (19 MiB),
t=2, p=1. Typisk outputformat:
$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
| | | | |
| | base64 salt parametre base64 hash
| version
algo argon2id
Hvorfor Argon2id anbefales
Modstand mod specialudstyr er i dag det afgørende kriterium. Bcrypt bruger lidt hukommelse (~4 KiB), som gør det muligt for en avanceret GPU at teste hundredtusindvis af hashes i sekundet. Argon2id er hukommelsessvært: fremtving flere MiB hukommelse pr. forsøg reducerer drastisk den opnåelige parallelitet på GPU og gør designet til dedikerede ASIC'er økonomisk urentabel.
Argon2ids hybridtilstand giver desuden beskyttelse mod sidekanalangreb i første halvdel af beregningen. Det er denne kombination, der retfærdiggør sin plads standardanbefaling fra OWASP, NIST SP 800-63B (siden revision 2024) og RFC 9106.
Sammenligningstabel
| Kriterium | Bcrypt | Argon2id |
|---|---|---|
| Årgang | 1999 | 2015 |
| Standardisering | De facto, USENIX 1999 | RFC 9106 (2021) |
| Parametre | koster | hukommelse, tid, parallelitet |
| Hukommelse brugt | ~4 KiB | Konfigurerbar (~19 MiB anbefales) |
| Hukommelsessvært | Nej | Ja |
| GPU-modstand | Moderat | Stærk |
| Sidekanalmodstand | God (konstant tid) | God (id-tilstand) |
| Inputgrænse | 72 bytes | Ingen |
| OWASP-anbefaling 2026 | Acceptabel | Foretrukket |
| Økosystemmodenhed | Meget bred | Bred siden ~2018 |
Ydeevne og modstand mod angreb
På en moderne server tager en bcrypt til cost=12 omkring 250 ms og et argon2id med parametre OWASP omkring 100-300 ms afhængig af maskine. Absolut tid er ikke kriteriet: hvad der tæller er forholdet mellem dine omkostninger (én beregning, én gang pr. login) og angriberens (milliarder). beregninger på GPU for at bryde et dump).
På en RTX 4090 når hashcat omkring 200.000 bcrypt/s til pris=12 sammenlignet med et par dusin tusindvis af argon2id på 19 MiB. For den samme beregningstid på serversiden sænker Argon2id farten angriberen 5 til 10 gange mere end bcrypt, og kløften bliver større med nyhederne generationer af GPU'er.
PHP eksempler
PHP understøtter deux-nativement via password_hash() og password_verify()
depuis PHP 7.2 til Argon2i (og 7.3 til Argon2id). PHP-konstruktøren kan vælge et format
automatisering.
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, ['omkostning' => 12]);
}
Argon2id
$opts = [
'memory_cost' => 19456, // 19 MiB
'time_cost' => 2,
'tråde' => 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);
}
Vous pouvez générer eller identifikator des hashs de tous typer avec notre generateur de hash og notre identifieur de hash.
Henstilling
For en ny applikation i 2026 skal du vælge Argon2id med indstillinger
OWASP som baseline (m=19456, t=2, p=1), justeres iht.
måltid (typisk 250 til 500 ms). Hvis du vedligeholder en eksisterende applikation i bcrypt, vil den
det haster ikke med at migrere: bcrypt til pris=12 eller mere forbliver sikkert i 2026. Udnyt
password_needs_rehash() ved næste login for gradvist at migrere brugere
aktiver til Argon2id.
Undgå absolut MD5, SHA-1 og bare SHA-256 for adgangskoder (se vores sammenligning MD5 vs SHA-256). Ingen af disse algoritmer er designet til denne brug.
Ofte stillede spørgsmål
Er Bcrypt stadig sikker i 2026?
Ja, forudsat at du bruger en tilstrækkelig pris (minimum 12, hvis muligt 14). Bcrypt har ikke kendt kryptografisk fejl. Dens eneste svaghed i forhold til Argon2id er dens lille fodaftryk hukommelse, hvilket gør den mere tilgængelig for GPU- og FPGA-angreb.
Skal vi migrere en bcrypt-database til Argon2id?
Ikke akut. En gradvis migrering med password_needs_rehash() er fremgangsmåden
anbefalet: med hvert vellykket login genhash du adgangskoden i Argon2id. I slutningen af
et par måneder migreres størstedelen af aktive brugere, og du kan tvinge en
nulstilles for hvilende konti.
Hvad er det rigtige antal tråde til Argon2id?
OWASP anbefaler som standard p=1. At øge p gør intet, hvis din
webserver behandler allerede en masse anmodninger parallelt og komplicerer tuning. Prioriter
snarere stigningen på m (hukommelse), som er hovedhåndtaget for GPU-modstand.
Hvad er en "bcrypt decrypter"?
Der er ingen bcrypt-dekryptering: funktionen er envejs ved konstruktion. Redskaberne der hævder at "dekryptere" bcrypt, tester bare adgangskodeordbøger strømninger mod hash. Dette er præcis det samme som at en angriber har dit bord.
Argon2i eller Argon2id?
Argon2id i alle tilfælde for adgangskoder. Argon2i er lidt mere sikker mod sidekanaler, men svagere mod GPU-angreb. Argon2id kombinerer fordele ved begge og anbefales udtrykkeligt af RFC 9106 til hashing af adgangskoder.
Skal vi tilføje peber ud over salt?
Salt er tilstrækkeligt til langt de fleste anvendelser. En peberfrugt (hemmelig nøgle opbevaret uden for basen af data og bruges som HMAC før hashen) tilføjer et lag i tilfælde af databaselæk uden at kompromittere applikationsserveren. Argon2id leverer det ikke indbygget, det skal det være ringe manuelt.