Bcrypt vs Argon2: vilken lösenordshash 2026

Bcrypt och Argon2 är de två mest använda hashfunktionerna för lösenord idag. Båda är utformade för att vara långsamma och motståndskraftiga mot brute force-attacker, till skillnad från MD5 eller SHA-256 som är snabba av design. Argon2 vann Password Hashing Competition 2015 och är numera det val som rekommenderas av OWASP för nya applikationer. Bcrypt är fortfarande ett utmärkt, moget och brett understött val. Den här artikeln förklarar exakt skillnaderna för att hjälpa dig att fatta beslut.

Varför en lösenordshash är annorlunda

En klassisk kryptografisk hash som SHA-256 är utformad för att vara snabb: man vill hasha flera GB data per sekund. För lösenord är denna egenskap en svaghet: en angripare som får tag i din användartabell kan testa miljarder lösenord per sekund på en GPU. En lösenordshashfunktion (PHF, password hashing function) strävar tvärtom efter att vara:

  • Långsam av design, med en justerbar kostnadsparameter
  • Saltad, för att förhindra rainbow tables och parallella attacker mot flera konton
  • Motståndskraftig mot specialiserad hårdvara (GPU, FPGA, ASIC) för att begränsa angriparens speedup

Saltet och kostnadsparametern lagras tillsammans med hashen, i en enda sträng som typiskt har formen $algo$params$salt$hash. Detta gör det möjligt att öka kostnaden över tid utan att tvinga fram en omedelbar migrering av gamla hashar.

Bcrypt: 1999, Blowfish, cost-parameter

Bcrypt utformades av Niels Provos och David Mazières för OpenBSD 1999. Det baseras på krypteringsalgoritmen Blowfish, vars höga kostnad för tabellinitialisering utnyttjas. Bcrypt exponerar en enda parameter, cost (eller rounds), som definierar antalet iterationer i formen 2^cost. Att öka cost med 1 fördubblar beräkningstiden.

Typiskt utdataformat:

$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
 |  |  |                      |
 |  |  cost = 12               salt + hash i base64
 |  variant (2y = openbsd)
 algo bcrypt

Bcrypt begränsar indata till 72 byte: ett längre lösenord trunkeras tyst, vilket är en känd fallgrop. Vanlig motåtgärd är att förhasha med SHA-256 och sedan base64-koda innan bcrypt, men det kan introducera problematiska null-byte i vissa implementationer. Argon2 har inte denna begränsning.

Argon2: 2015, PHC-vinnare, 3 varianter

Argon2 utformades av Alex Biryukov, Daniel Dinu och Dmitry Khovratovich. Det vann Password Hashing Competition i juli 2015 och är standardiserat genom RFC 9106 (2021). Argon2 exponerar tre parametrar:

  • Memory cost (m): mängd minne som används, i KiB
  • Time cost (t): antal iterationer över minnesblocket
  • Parallelism (p): antal parallella trådar

Argon2 finns i tre varianter:

  • Argon2d: databeroende minnesåtkomst. Mer motståndskraftig mot GPU-attacker men känslig för sidokanalsattacker (timing, cache).
  • Argon2i: dataoberoende minnesåtkomst. Motståndskraftig mot sidokanaler, något mindre motståndskraftig mot GPU-attacker.
  • Argon2id: hybrid, startar i i-läge och växlar sedan till d-läge. Rekommenderad som standard av RFC 9106 och OWASP.

OWASP-rekommenderade parametrar 2026 för Argon2id: m=19456 KiB (19 MiB), t=2, p=1. Typiskt utdataformat:

$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
 |         |   |                  |                 |
 |         |   parametrar          salt base64       hash base64
 |         version
 algo argon2id

Varför Argon2id rekommenderas

Motstånd mot specialiserad hårdvara är idag det avgörande kriteriet. Bcrypt använder lite minne (~4 KiB), vilket gör att en avancerad GPU kan testa hundratusentals hashar per sekund. Argon2id är memory-hard: att tvinga fram flera MiB minne per försök minskar drastiskt den parallellism som kan uppnås på GPU och gör utformningen av dedikerade ASIC ekonomiskt olönsam.

Argon2id:s hybridläge erbjuder dessutom skydd mot sidokanalsattacker under första halvan av beräkningen. Det är denna kombination som motiverar dess plats som standardrekommendation från OWASP, NIST SP 800-63B (sedan revideringen 2024) och RFC 9106.

Jämförelsetabell

Kriterium Bcrypt Argon2id
År19992015
StandardiseringDe facto, USENIX 1999RFC 9106 (2021)
Parametrarcostmemory, time, parallelism
Minnesanvändning~4 KiBKonfigurerbar (~19 MiB rekommenderas)
Memory-hardNejJa
GPU-motståndMåttligtStarkt
SidokanalsmotståndBra (constant-time)Bra (id-läge)
Indatabegränsning72 byteIngen
OWASP-rekommendation 2026AcceptabelFöredragen
Ekosystemets mognadMycket storStor sedan ~2018

Prestanda och motståndskraft mot attacker

På en modern server tar bcrypt med cost=12 ungefär 250 ms och argon2id med OWASP-parametrarna omkring 100-300 ms beroende på maskin. Den absoluta tiden är inte kriteriet: det som räknas är förhållandet mellan din kostnad (en beräkning, en gång per inloggning) och angriparens kostnad (miljarder beräkningar på GPU för att knäcka en dump).

På ett RTX 4090 når hashcat ungefär 200 000 bcrypt/s vid cost=12, mot några tiotusentals argon2id vid 19 MiB. För samma beräkningstid på serversidan saktar Argon2id ned angriparen 5 till 10 gånger mer än bcrypt, och gapet ökar med nya GPU-generationer.

PHP-exempel

PHP stödjer båda nativt via password_hash() och password_verify() sedan PHP 7.2 för Argon2i (och 7.3 för Argon2id). PHP-konstruktorn hanterar salt och format automatiskt.

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

Du kan generera eller identifiera hashar av alla typer med vår hashgenerator och vår hashidentifierare.

Rekommendation

För en ny applikation 2026, välj Argon2id med OWASP-parametrarna som baslinje (m=19456, t=2, p=1), och justera efter måltid (typiskt 250 till 500 ms). Om du underhåller en befintlig applikation med bcrypt är det inte bråttom att migrera: bcrypt med cost=12 eller mer förblir säker 2026. Använd password_needs_rehash() vid nästa inloggning för att gradvis migrera aktiva användare till Argon2id.

Undvik absolut MD5, SHA-1 och naken SHA-256 för lösenord (se vår jämförelse MD5 vs SHA-256). Ingen av dessa algoritmer är utformad för denna användning.

Vanliga frågor

Är bcrypt fortfarande säker 2026?

Ja, förutsatt att du använder en tillräcklig cost (minst 12, helst 14). Bcrypt har inga kända kryptografiska svagheter. Dess enda relativa svaghet jämfört med Argon2id är dess låga minnesanvändning, som gör den mer tillgänglig för GPU- och FPGA-attacker.

Bör man migrera en bcrypt-databas till Argon2id?

Inte brådskande. En gradvis migrering med password_needs_rehash() är det rekommenderade tillvägagångssättet: vid varje lyckad inloggning hashar du om lösenordet i Argon2id. Efter några månader är majoriteten av aktiva användare migrerade, och du kan tvinga fram en återställning för vilande konton.

Vad är ett bra antal trådar för Argon2id?

OWASP rekommenderar p=1 som standard. Att öka p ger inget om din webbserver redan hanterar många parallella förfrågningar, och komplicerar tuningen. Föredra istället att öka m (minne) som är den främsta hävstången för GPU-motstånd.

Vad är en "bcrypt decrypter"?

Det finns ingen bcrypt-dekrypterare: funktionen är enkelriktad av design. Verktyg som påstår sig "dekryptera" bcrypt testar bara ordlistor med vanliga lösenord mot hashen. Det är exakt samma sak som en angripare som har din tabell skulle göra.

Argon2i eller Argon2id?

Argon2id i samtliga fall för lösenord. Argon2i är något säkrare mot sidokanaler men svagare mot GPU-attacker. Argon2id kombinerar fördelarna med båda och är uttryckligen rekommenderad av RFC 9106 för lösenordshashning.

Bör man peppra (pepper) utöver saltet?

Saltet räcker för den stora majoriteten av applikationer. En peppar (hemlig nyckel som lagras utanför databasen och används som HMAC före hashen) lägger till ett lager vid läckage av databasen utan kompromettering av applikationsservern. Argon2id tillhandahåller det inte nativt, det måste komponeras manuellt.