Bcrypt vs Argon2: kuris slaptažodžio maišas 2026 m

Bcrypt ir Argon2 yra dvi žodžių maišos funkcijos šiandien dažniausiai naudojami slaptažodžiai. Abu yra sukurti taip, kad būtų lėti ir atsparūs Brutalios jėgos atakos, skirtingai nei MD5 ar SHA-256, kurių konstrukcija yra greita. Argonas2a laimėjo slaptažodžių maišos konkursą 2015 m. ir dabar yra OWASP rekomenduojamas pasirinkimas naujoms programoms. „Bcrypt“ išlieka puikus, brandus ir plačiai palaikomas pasirinkimas. Tai Šiame straipsnyje tiksliai paaiškinami skirtumai, kad būtų lengviau apsispręsti.

Kodėl slaptažodžio maiša skiriasi

Klasikinė kriptografinė maiša, tokia kaip SHA-256, sukurta taip, kad būtų greita: norime naudoti maišą GB duomenų per sekundę. Slaptažodžiams ši nuosavybė yra numatytoji: užpuolikas kuri nuskaito jūsų vartotojų lentelę, gali patikrinti milijardus slaptažodžių per sekundę a GPU. Priešingai, slaptažodžio maišos funkcija (PHF) siekia būti:

  • Lėtas pagal konstrukciją su reguliuojamu kainos parametru
  • Sūrus, kad būtų išvengta vaivorykštės lentelių ir lygiagrečių atakų prieš kelias paskyras
  • Atsparus specializuotai aparatūrai (GPU, FPGA, ASIC), kad būtų apribotas priešiškas pagreitis

Druskos ir kainos parametras išsaugomas su maiša, paprastai vienoje eilutėje formos $algo$params$sel$hash. Tai leidžia laikui bėgant kainai didėti be priversti nedelsiant perkelti senas maišas.

Bcrypt: 1999, Blowfish, kainos parametras

Bcrypt sukūrė Niels Provos ir David Mazières OpenBSD 1999 m. pagrįstas Blowfish šifravimo algoritmu, iš kurio išnaudojama didelė inicijavimo kaina. lenteles. Bcrypt atskleidžia vieną parametrą cost (arba rounds), kuris apibrėžia iteracijų skaičius formoje 2^kaina. Kainos padidinimas 1 padvigubina skaičiavimo laiką.

Įprastas išvesties formatas:

$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
 |  |  |                      |
 |  |  kaina = 12 druskos + maiša bazėje64
 |  variantas (2y = openbsd)
 algo bcrypt

„Bcrypt“ riboja įvestį iki 72 baitų: ilgesnis slaptažodis tyliai sutrumpinamas, o tai yra žinomi spąstai. Įprastas sprendimas yra iš anksto užkoduoti maišą naudojant SHA-256, tada užkoduoti base64 bcrypt, tačiau tai gali sukelti probleminių nulinių baitų kai kuriuose diegimuose. Argon2 neturi šios ribos.

Argon2: 2015, PHC nugalėtojas, 3 variantai

Argon2 sukūrė Aleksas Birjukovas, Danielis Dinu ir Dmitrijus Chovratovičius. Jis turi liepos mėn. laimėjo slaptažodžių maišos konkursą 2015 m. ir yra standartizuotas pagal RFC 9106 (2021). Argon2 atskleidžia tris parametrus:

  • Atminties kaina (m): sunaudotos atminties kiekis, KiB
  • Laiko kaina (t): iteracijų skaičius atminties bloke
  • Paralelizmas (p): lygiagrečių gijų skaičius

Argon2 egzistuoja trimis variantais:

  • Argon2d: nuo duomenų priklausoma prieiga prie atminties. Atsparesnis GPU atakoms, bet jautrus šoninio kanalo atakoms (laikas, talpykla).
  • Argon2i: nuo duomenų nepriklausoma prieiga prie atminties. Atsparus šoniniams kanalams, šiek tiek mažiau atsparus GPU atakoms.
  • Argon2id: hibridas, paleidžiamas režimu i, tada persijungia į d režimą. Rekomenduoja pagal numatytuosius nustatymus pagal RFC 9106 ir OWASP.

2026 m. OWASP rekomenduojami Argon2id parametrai: m=19456 KiB (19 MiB), t=2, p=1. Įprastas išvesties formatas:

$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
 |         |   |                  |                 |
 |         |   base64 druskos parametrai base64 maiša
 |         versija
 algo argon2id

Kodėl Argon2id rekomenduojamas

Atsparumas specializuotai įrangai šiandien yra lemiamas kriterijus. Bcrypt naudoja mažai atminties (~ 4 KiB), kuri leidžia aukščiausios klasės GPU išbandyti šimtus tūkstančių maišų per sekundę. Argon2id yra atminties sunku: priverskite kelis MiB atminties vienam bandymui drastiškai sumažina lygiagretumą, pasiekiamą naudojant GPU, ir sukuria tam skirtus ASIC ekonomiškai nenaudinga.

Argon2id hibridinis režimas papildomai suteikia apsaugą nuo šoninių kanalų atakų per pirmąją skaičiavimo pusę. Būtent šis derinys pateisina jo vietą Numatytoji rekomendacija iš OWASP, NIST SP 800-63B (nuo 2024 m. peržiūros) ir RFC 9106.

Palyginimo lentelė

Kriterijus Bcrypt Argon2id
Metai19992015
StandartizavimasDe facto, USENIX 1999RFC 9106 (2021)
Parametraikainuojaatmintį, laiką, lygiagretumą
Naudojama atmintis~4 KiBKonfigūruojama (rekomenduojama apie 19 MiB)
Nebloga atmintisNeTaip
GPU atsparumasVidutinisTvirtas
Šoninio kanalo atsparumasGeras (nuolatinis laikas)Geras (id režimas)
Įvesties apribojimas72 baitaiNėra
OWASP rekomendacija 2026 m.PriimtinaPageidautina
Ekosistemos brandaLabai platiPlati nuo ~2018 m.

Našumas ir atsparumas atakoms

Šiuolaikiniame serveryje bcrypt už 12 kainą užtrunka apie 250 ms ir argon2id su parametrais OWASP maždaug 100–300 ms, priklausomai nuo mašinos. Absoliutus laikas nėra kriterijus: tai, kas svarbu santykis tarp jūsų išlaidų (vienas skaičiavimas, kartą per prisijungimą) ir užpuoliko (milijardai GPU skaičiavimai, kad būtų nutrauktas išmetimas).

RTX 4090 „hashcat“ pasiekia maždaug 200 000 bcrypt/s, kai kaina = 12, palyginti su keliomis dešimtimis tūkstančiai argon2id 19 MiB. Per tą patį serverio pusės skaičiavimo laiką Argon2id sulėtėja užpuolikas 5–10 kartų daugiau nei bcrypt, o atotrūkis didėja su naujienomis kartos GPU.

PHP pavyzdžiai

PHP palaiko ir natūraliai per password_hash() ir password_verify() nuo PHP 7.2 Argon2i (ir 7.3 Argon2id). PHP konstruktorius valdo druską ir formatą automatiškai.

Bcrypt

$hash = password_hash($slaptažodis, PASSWORD_BCRYPT, ['kaina' => 12]);
$ok = slaptažodis_patvirtinti($slaptažodis, $maiša);

if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) {
    $hash = slaptažodis_hash($slaptažodis, PASSWORD_BCRYPT, ['kaina' => 12]);
}

Argon2id

$opts = [
    'atminties_kaina' => 19456, // 19 MiB
    'time_cost' => 2,
    'gijos' => 1,
];
$hash = slaptažodis_hash($slaptažodis, PASSWORD_ARGON2ID, $opts);
$ok = slaptažodis_patvirtinti($slaptažodis, $maiša);

if (password_needs_rehash($hash, PASSWORD_ARGON2ID, $opts)) {
    $hash = slaptažodis_hash($slaptažodis, PASSWORD_ARGON2ID, $opts);
}

Su mūsų galite generuoti arba identifikuoti visų tipų maišas maišos generatorius ir mūsų maišos identifikatorius.

Rekomendacija

Jei norite naudoti naują programą 2026 m., pasirinkite Argon2id su nustatymais OWASP kaip bazinė linija (m=19456, t=2, p=1), turi būti koreguojama pagal tikslinis laikas (paprastai nuo 250 iki 500 ms). Jei palaikote esamą programą bcrypt, ji nereikia skubiai perkelti: bcrypt kaina = 12 ar daugiau išlieka saugi 2026 m. Pasinaudokite password_needs_rehash() kito prisijungimo metu, kad naudotojai būtų palaipsniui perkelti turto Argon2id.

Visiškai venkite slaptažodžių MD5, SHA-1 ir atviro SHA-256 (žr MD5 ir SHA-256 palyginimas). Nė vienas iš šių algoritmų nėra skirtas šiam naudojimui.

Dažnai užduodami klausimai

Ar „Bcrypt“ vis dar saugus 2026 m.?

Taip, jei naudojate pakankamai išlaidų (12 mažiausiai, 14, jei įmanoma). Bcrypt neturi žinomas kriptografinis trūkumas. Vienintelis jo trūkumas, palyginti su Argon2id, yra mažas plotas atmintį, todėl ji tampa labiau prieinama GPU ir FPGA atakoms.

Ar turėtume perkelti bcrypt duomenų bazę į Argon2id?

Ne skubiai. Laipsniškas perkėlimas naudojant password_needs_rehash() yra būdas rekomenduojama: su kiekvienu sėkmingu prisijungimu iš naujo sumaišote slaptažodį Argon2id. Pabaigoje po kelių mėnesių dauguma aktyvių vartotojų perkeliami, ir jūs galite priversti a iš naujo nustatyti neveikiančias paskyras.

Koks yra tinkamas Argon2id gijų skaičius?

Pagal numatytuosius nustatymus OWASP rekomenduoja p=1. p padidinimas nieko nedaro, jei jūsų žiniatinklio serveris jau lygiagrečiai apdoroja daugybę užklausų ir apsunkina derinimą. Suteikite pirmenybę o m (atminties) padidėjimas, kuris yra pagrindinis GPU pasipriešinimo svirtis.

Kas yra „bcrypt decrypter“?

Bcrypt iššifruotojo nėra: funkcija yra vienpusė pagal konstrukciją. Įrankiai kurie teigia „iššifruojantys“ bcrypt, tik išbando slaptažodžių žodynus srovės prieš maišą. Tai lygiai tas pats, kaip užpuolikas, turintis jūsų stalą.

Argon2i ar Argon2id?

Argon2id visais slaptažodžių atvejais. Argon2i yra šiek tiek daugiau saugus nuo šoninių kanalų, bet silpnesnis prieš GPU atakas. Argon2id kombainai abiejų privalumų ir yra aiškiai rekomenduojamas RFC 9106 slaptažodžių maišymui.

Ar be druskos reikėtų dėti pipirų?

Daugeliui naudojimo atvejų pakanka druskos. Pipiras (slaptas raktas, saugomas už pagrindo duomenų ir naudojamas kaip HMAC prieš maišą) prideda sluoksnį duomenų bazės nutekėjimo atveju nepažeidžiant programų serverio. Argon2id jo neteikia natūraliai, taip turi būti rinkti rankiniu būdu.