Bcrypt vs Argon2: mikä salasanahash vuonna 2026

Bcrypt ja Argon2 ovat kaksi nykyään eniten käytettyä salasanojen hajautusfunktiota. Molemmat on suunniteltu hitaiksi ja vastustuskykyisiksi raaka voima -hyökkäyksille, toisin kuin MD5 tai SHA-256, jotka on rakenteellisesti suunniteltu nopeiksi. Argon2 voitti Password Hashing Competition -kilpailun vuonna 2015 ja on nykyään OWASP:n suosittelema valinta uusiin sovelluksiin. Bcrypt on edelleen erinomainen, kypsä ja laajasti tuettu vaihtoehto. Tässä artikkelissa selitetään tarkat erot, jotta voit tehdä päätöksen.

Miksi salasanahash on erilainen

Perinteinen kryptografinen tiiviste, kuten SHA-256, on suunniteltu olemaan nopea: haluamme tiivistää gigatavuittain tietoa sekunnissa. Salasanojen kohdalla tämä ominaisuus on heikkous: hyökkääjä, joka saa haltuunsa käyttäjätaulukkosi, voi testata miljardeja salasanoja sekunnissa GPU:lla. Salasanojen hajautusfunktio (PHF, password hashing function) pyrkii päinvastoin olemaan:

  • Rakenteellisesti hidas, säädettävällä kustannusparametrilla
  • Suolattu, estämään sateenkaaritaulukot ja rinnakkaiset hyökkäykset useille tileille
  • Vastustuskykyinen erikoistuneelle laitteistolle (GPU, FPGA, ASIC) rajoittaakseen vastustajan saamaa nopeusetua

Suola ja kustannusparametri tallennetaan yhdessä tiivisteen kanssa yhteen merkkijonoon, joka on tyypillisesti muotoa $algo$params$suola$tiiviste. Tämä mahdollistaa kustannusten nostamisen ajan myötä ilman, että vanhoja tiivisteitä on pakko siirtää välittömästi.

Bcrypt: 1999, Blowfish, cost-parametri

Niels Provos ja David Mazières suunnittelivat Bcryptin OpenBSD:lle vuonna 1999. Se perustuu Blowfish-salausalgoritmiin, jonka taulukoiden alustamisen korkeaa kustannusta se hyödyntää. Bcrypt tarjoaa yhden parametrin, cost (tai rounds), joka määrittelee iteraatioiden määrän muodossa 2^cost. Cost-arvon nostaminen yhdellä kaksinkertaistaa laskenta-ajan.

Tyypillinen tulosmuoto:

$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
 |  |  |                      |
 |  |  cost = 12               suola + tiiviste base64-muodossa
 |  variantti (2y = openbsd)
 algo bcrypt

Bcrypt rajoittaa syötteen 72 tavuun: pidemmät salasanat katkaistaan hiljaisesti, mikä on tunnettu sudenkuoppa. Tavallinen ratkaisu on esitiivistää salasana SHA-256:lla ja koodata se base64-muotoon ennen bcryptiä, mutta tämä voi aiheuttaa ongelmia nollatavujen kanssa joissakin toteutuksissa. Argon2:lla ei ole tätä rajoitusta.

Argon2: 2015, PHC-voittaja, 3 varianttia

Argon2:n suunnittelivat Alex Biryukov, Daniel Dinu ja Dmitry Khovratovich. Se voitti Password Hashing Competition -kilpailun heinäkuussa 2015 ja on standardoitu RFC 9106 (2021) -asiakirjassa. Argon2 tarjoaa kolme parametria:

  • Memory cost (m): käytetyn muistin määrä, KiB-yksikössä
  • Time cost (t): iteraatioiden määrä muistilohkossa
  • Parallelism (p): rinnakkaisten säikeiden määrä

Argon2:sta on kolme varianttia:

  • Argon2d: tiedoista riippuvainen muistin käyttö. Vastustuskykyisempi GPU-hyökkäyksille, mutta altis sivukanavahyökkäyksille (ajoitus, välimuisti).
  • Argon2i: tiedoista riippumaton muistin käyttö. Vastustuskykyinen sivukanavahyökkäyksille, hieman vähemmän vastustuskykyinen GPU-hyökkäyksille.
  • Argon2id: hybridi, alkaa i-tilassa ja siirtyy d-tilaan. Oletussuositus RFC 9106:n ja OWASP:n mukaan.

OWASP:n suosittelemat parametrit vuodelle 2026 Argon2id:lle: m=19456 KiB (19 MiB), t=2, p=1. Tyypillinen tulosmuoto:

$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
 |         |   |                  |                 |
 |         |   parametrit          suola base64      tiiviste base64
 |         versio
 algo argon2id

Miksi Argon2id on suositeltu

Vastustuskyky erikoistuneelle laitteistolle on nykyään ratkaiseva kriteeri. Bcrypt käyttää vähän muistia (~4 KiB), minkä ansiosta huippuluokan GPU voi testata satoja tuhansia tiivisteitä sekunnissa. Argon2id on muistisyöppö (memory-hard): useiden MiB:ien muistin pakottaminen yritystä kohti vähentää dramaattisesti GPU:lla saavutettavaa rinnakkaisuutta ja tekee dedikoitujen ASIC-piirien suunnittelusta taloudellisesti kannattamatonta.

Argon2id:n hybriditila tarjoaa lisäksi suojan sivukanavahyökkäyksiä vastaan laskennan ensimmäisen puoliskon aikana. Tämä yhdistelmä oikeuttaa sen aseman OWASP:n, NIST SP 800-63B:n (vuoden 2024 tarkistuksesta alkaen) ja RFC 9106:n oletussuosituksena.

Vertailutaulukko

Kriteeri Bcrypt Argon2id
Vuosi19992015
StandardointiDe facto, USENIX 1999RFC 9106 (2021)
Parametritcostmemory, time, parallelism
Käytetty muisti~4 KiBSäädettävissä (~19 MiB suositus)
Muistisyöppö (Memory-hard)EiKyllä
GPU-vastustuskykyKohtalainenVahva
SivukanavavastustuskykyHyvä (vakioaika)Hyvä (id-tila)
Syöterajoitus72 tavuaEi ole
OWASP 2026 -suositusHyväksyttäväEnsisijainen
Ekosysteemin kypsyysErittäin laajaLaaja vuodesta ~2018

Suorituskyky ja hyökkäyskestävyys

Nykyaikaisella palvelimella bcrypt cost=12 -asetuksella kestää noin 250 ms ja argon2id OWASP-parametreilla noin 100–300 ms koneesta riippuen. Absoluuttinen aika ei ole kriteeri: ratkaisevaa on suhde sinun kustannuksesi (yksi laskenta, kerran kirjautumista kohden) ja hyökkääjän kustannuksen välillä (miljardeja laskutoimituksia GPU:lla tiivisteiden murtamiseksi).

RTX 4090 -näytönohjaimella hashcat saavuttaa noin 200 000 bcrypt/s nopeuden cost=12 -asetuksella, kun taas argon2id:llä 19 MiB:n muistilla nopeus on muutamia kymmeniä tuhansia. Samalla palvelinpuolen laskenta-ajalla Argon2id hidastaa hyökkääjää 5–10 kertaa enemmän kuin bcrypt, ja ero kasvaa uusien GPU-sukupolvien myötä.

PHP-esimerkit

PHP tukee molempia natiivisti password_hash()- ja password_verify()-funktioiden kautta PHP 7.2:sta alkaen Argon2i:lle (ja 7.3:sta Argon2id:lle). PHP hallitsee suolan ja muodon automaattisesti.

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

Voit luoda tai tunnistaa kaikentyyppisiä tiivisteitä tiivistegeneraattorillamme ja tiivisteentunnistimellamme.

Suositus

Uudessa sovelluksessa vuonna 2026 valitse Argon2id OWASP-parametreilla perustasoksi (m=19456, t=2, p=1) ja säädä niitä tavoiteajan mukaan (tyypillisesti 250–500 ms). Jos ylläpidät olemassa olevaa bcrypt-sovellusta, siirtymisellä ei ole kiire: bcrypt cost=12 tai suuremmalla asetuksella on edelleen turvallinen vuonna 2026. Hyödynnä password_needs_rehash()-funktiota seuraavan kirjautumisen yhteydessä siirtääksesi aktiiviset käyttäjät vähitellen Argon2id:hen.

Vältä ehdottomasti pelkkää MD5-, SHA-1- tai SHA-256-hajautusta salasanoille (katso MD5 vs SHA-256 -vertailumme). Mitään näistä algoritmeista ei ole suunniteltu tähän tarkoitukseen.

Usein kysytyt kysymykset

Onko Bcrypt edelleen turvallinen vuonna 2026?

Kyllä, edellyttäen että käytetään riittävää cost-arvoa (vähintään 12, mieluiten 14). Bcryptissä ei ole tunnettuja kryptografisia heikkouksia. Sen ainoa suhteellinen heikkous Argon2id:hen verrattuna on pieni muistinkulutus, mikä tekee siitä alttiimman GPU- ja FPGA-hyökkäyksille.

Pitääkö bcrypt-tietokanta siirtää Argon2id:hen?

Ei kiireellisesti. Suositeltu tapa on asteittainen siirtyminen password_needs_rehash()-funktion avulla: jokaisen onnistuneen kirjautumisen yhteydessä tiivistät salasanan uudelleen Argon2id:llä. Muutaman kuukauden kuluttua suurin osa aktiivisista käyttäjistä on siirretty, ja voit pakottaa salasanan vaihdon lopuille käyttämättömille tileille.

Mikä on oikea määrä säikeitä (threads) Argon2id:lle?

OWASP suosittelee oletuksena p=1. Parametrin p nostaminen ei tuo hyötyä, jos verkkopalvelimesi käsittelee jo valmiiksi useita pyyntöjä rinnakkain, ja se vaikeuttaa hienosäätöä. Suosi sen sijaan m-arvon (muisti) nostamista, joka on tärkein tekijä GPU-vastustuskyvyssä.

Mikä on ”bcrypt decrypter”?

Bcrypt-purkajaa ei ole olemassa: funktio on rakenteellisesti yksisuuntainen. Työkalut, jotka väittävät "purkavansa" bcryptin, testaavat vain yleisiä salasanakirjastoja tiivistettä vastaan. Se on täsmälleen sama asia, mitä hyökkääjä tekisi taulukollesi.

Argon2i vai Argon2id?

Salasanoille aina Argon2id. Argon2i on hieman turvallisempi sivukanavahyökkäyksiä vastaan, mutta heikompi GPU-hyökkäyksiä vastaan. Argon2id yhdistée molempien edut ja on nimenomaan RFC 9106:n suositus salasanojen hajautukseen.

Pitäisikö suolan lisäksi käyttää pippuria (pepper)?

Suola riittää valtaosaan sovelluksista. Pippuri (salainen avain, joka tallennetaan tietokannan ulkopuolelle ja jota käytetään HMAC:na ennen hajautusta) lisää suojauskerroksen tilanteessa, jossa tietokanta vuotaa mutta sovelluspalvelin ei vaarannu. Argon2id ei tarjoa tätä natiivisti, se on toteutettava manuaalisesti.