Salasanatiivisteen generaattori ja vahvistin

Tiivistä ja vahvista salasanoja bcrypt-, scrypt-, Argon2id- ja PBKDF2-algoritmeilla kokonaan selaimessa - luo PHC-muotoisia merkkijonoja, tarkista ehdokassalasana olemassa olevaa tiivistettä vastaan ja tarkastele sen sisältämiä parametreja. Mitään ei ladata.
Vain testisalasanoille. Oikeita käyttäjien salasanoja ei koskaan kannata liittää mihinkään verkkosivuun. Tämä työkalu toimii kokonaan selaimessa — merkkijonot eivät poistu välilehdeltäsi — mutta todellinen tietovuoto alkaa yhdestä liitöksestä.
bcrypt-kustannus (2^kustannus kierrosta)
bcrypt-variantti variantti muuttaa vain etuliitettä; tiiviste itse on identtinen
scrypt N (suorittimen kustannus)
scrypt r / p r =   p = lohkon koko 128·r tavua; muisti = 128·N·r tavua (N=214, r=8 → 16 MiB)
Argon2id m (muisti)
Argon2id t / p t =   p = t = kierrokset; p = rinnakkaisuus (kaistat)
PBKDF2 PRF
PBKDF2-iteraatiot  OWASP 2023: 600 000 HMAC-SHA-256:lle (1 300 000 SHA-1:lle, 210 000 SHA-384/512:lle)
Tulosteen pituus (tavua)  bcryptin tulos on kiinteä 23 tavua (31 bcrypt-base64-merkkiä)
AlgoritmiParametritMuistiTulosteen pituusAika (tämä selain)
bcryptkustannus 124 KiB23 tavua-
scryptN=214, r=8, p=116 MiB32 tavua-
Argon2idm=19 MiB, t=2, p=119 MiB32 tavua-
PBKDF2HMAC-SHA-256, 600 000 iteraatiota~032 tavua-
Parametrien pikaviite (OWASP Password Storage Cheat Sheet, 2023 -vähimmäisarvot)
AlgoritmiVähimmäisarvoHuomautukset
Argon2idm = 19 MiB (19 456 KiB), t = 2, p = 1suositeltu; muistikovuus
scryptN = 214, r = 8, p = 1muistikovuus (vähintään 16 MiB)
bcryptkustannus = 10vain työtekijä; 72 tavun salasanaraja
PBKDF2-HMAC-SHA256600 000 iteraatiotavain iteraatiokovuus — GPU-ystävällinen, viimeinen valinta
Tämän sivun oletukset ovat jokaisen vähimmäisarvon tasolla tai sen yläpuolella. Tuotannossa valitse ensin Argon2id, scrypt tai bcrypt, jos Argon2id ei ole saatavilla, ja PBKDF2 vain FIPS-yhteensopivuussyistä.
PHP-yhteentoimivuus - password_hash($pw, PASSWORD_BCRYPT) tuottaa $2y$10$...-merkkijonon: liitä se Vahvista-kenttään ehdokassalasanan kanssa, ja tämä sivu vastaa täsmälleen siihen, mitä password_verify() vastaisi. PASSWORD_ARGON2ID-tuloste ($argon2id$v=19$m=65536,t=4,p=1$...) vahvistuu myös. PHC-merkkijonot passlibilta, django-argon2:lta ja crypto.scrypt-kääreistä jäsentyvät myös.
Itsetesti
Ajaa sivun moottorin uudelleen julkisia vektoreita vastaan: crypt_blowfish-testisarja bcrypt-tiivisteille, node/OpenSSL-tuotetut scrypt- ja Argon2id-merkkijonot, RFC 6070:n PBKDF2-vektorit ja julkinen SHA-256-joukko sekä luo-ja-vahvista-kierrokset jokaisella algoritmilla ja negatiiviset testit (väärä salasana on epäonnistuttava, virheelliset merkkijonot on hylättävä). Mitään ei lähetetä minnekään.
Salasanatiivistys selitettynä alusta asti
Yhdellä lauseella: salasanatiiviste on tarkoituksella hidas (ja mieluiten muistia kuluttava), jotta tietokannan varastaminen ei anna hyökkääjälle miljardeja arvauksia sekunnissa - päinvastainen tavoite kuin nopealla tiivisteellä kuten SHA-256, joka on tehty nopeuteen.
Miksi ei vain SHA-256 salasanalle?

SHA-256 nykyaikaisella GPU:lla toimii miljardeilla arvauksilla sekunnissa. 8 merkin salasanalla on selvästi alle 1013 yhdistelmää — tunteja GPU-aikaa, minuutteja suurella koneella. Salasanatiivistysfunktiot (KDF:t) torjuvat tätä kustannusparametreilla: bcrypt toistaa ydintään 2cost kertaa, PBKDF2 iteroi HMAC:ia satoja tuhansia kertoja, ja scrypt ja Argon2id vaativat lisäksi megatavuja muistia arvausta kohden, jolloin GPU:t (nopeita mutta muistiköyhiä ytimeltään) menettävät etunsa. Suola — satunnainen, tallennettu selkeänä tiivisteen merkkijonon sisään — estää esilasketut sateenkaaritaulukot ja pakottaa jokaisen arvauksen laskemaan uudelleen jokaiselle käyttäjälle.

Tämän sivun neljä algoritmia
AlgoritmiVuosiKovuusAllekirjoitusmuotoVaro
bcrypt1999suoritin (2cost avaimen asetusta)$2b$12$ + 22 merkin suola + 31 merkin tiiviste72 tavun salasanaraja (kaikki yli 72 tavun ylittävä jätetään hiljaa huomiotta); NUL-tavu päättää salasanan alkuperäisessä C-toteutuksessa
PBKDF22000 (RFC 2898/8018)suoritin (iteraatiot)$pbkdf2-sha256$i=600000$ + suola + tiiviste (passlib-tyyli)ei muistikustannusta — GPU:t ja ASIC:t pitävät siitä; vain iteraatiomäärä on säädettävissä
scrypt2009 (RFC 7914)suoritin + muisti (128·N·r tavua)$scrypt$ln=14,r=8,p=1$ + suola + tiivisteN:n on oltava kahden potenssi; muisti kasvaa lineaarisesti r:n mukaan
Argon2id2015 (PHC-voittaja, RFC 9106)suoritin + muisti (m KiB, t kierrosta)$argon2id$v=19$m=19456,t=2,p=1$ + suola + tiivisteArgon2i (datasta riippumaton) vs. Argon2d (datasta riippuva) vs. Argon2id (hybridi) — valitse aina id, ellei tiedä, miksi ei
Muistikovuus vs. laskentakovuus

GPU:lla on tuhansia ytimiä, mutta jokaisella ytimellä on käytössään vain vähän nopeaa muistia. KDF, joka tarvitsee 19 MiB:n työjoukon arvausta kohden, rajoittaa hyökkääjän rinnakkaisten arvausten määrän siihen, kuinka monta 19 MiB:n muistipalaa hänellä on — siksi Argon2id 19 MiB:llä voi käytännössä olla vahvempi kuin bcrypt-kustannuksella 15, vaikka kannettavallasi se vie vähemmän kelloaikaa. PBKDF2:lla ei ole tähän vastausta: sen ainoa säädin on iteraatiomäärä, ja piiri skaalautuu siinä lineaarisesti.

PHC-merkkijonon lukeminen

Modulaari-crypt- / PHC-muoto kuvaa itsensä: merkkijonossa $argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf... kentät ovat algoritmi, versio, parametrit (m = muisti KiB:nä, t = kierrokset, p = kaistat), base64-suola ja base64-tiiviste. bcrypt edeltää standardia ja käyttää omaa tiivistä muotoaan: $2b$-variantti, 12 kustannus, sitten suola ja tiiviste bcryptin omassa base64-aakkostossa (./A-Za-z0-9). Tämän sivun Vahvista hyväksyy kaikki nämä ja näyttää jäsennetyt kentät — liitä mikä tahansa löytämäsi tiiviste ja katso, mihin se hajoaa.

Yleisiä virheitä
  • Nopea tiiviste salasanoille. MD5/SHA-1/SHA-256-salasanasarakkeet kaatuvat tavallisille GPU:ille miljardeilla arvauksilla sekunnissa. Käytä Tiivistegeneraattoria tiedostoille ja datalle; käytä tämän sivun algoritmeja salasanoille.
  • Suolan jakaminen. Yksi suola kaikille käyttäjille tarkoittaa, että samat salasanat antavat samat tiivisteet ja sateenkaaritaulukot toimivat. Jokainen tämän sivun tiiviste saa uuden 16 tavun satunnaissuolan.
  • bcryptin 72 tavun ohittaminen. "a"*100 ja "a"*72 tiivistyvät identtisesti - häntä pudotetaan. Tämä sivu varoittaa syöttökentässä, kun salasana ylittää 72 tavua. Argon2:lla ei ole tällaista rajaa.
  • Tiivisteiden vertailu ==-operaattorilla omassa koodissasi. Vahvistuksen on oltava vakioaikainen; sivun moottori tekee sen sisäisesti (laskee uudelleen ja vertaa tallennettuja tavuja), mutta jos kopioit lähestymistavan, käytä vakioaikaista vertailua.
  • Parametrien viritys nopealla kehityskoneella. Tavoittele noin 250-500 ms tiivistämisaikaa tuotantokäyttäjiesi mediaanilaitteistolla, ei työasemallasi. Vertailu-painike näyttää, mitä tämä selain todella kokee.
  • Uudelleentiivistäminen jokaisessa kirjautumistarkistuksessa. Vahvista ensin; tiivistä uudelleen (esim. kustannuksen korottamiseksi) vasta onnistuneen vahvistuksen jälkeen ja tallenna uusi merkkijono. PHP-funktio password_needs_rehash() on olemassa juuri tähän.
UKK

Kumman pitäisi valita? Argon2id vähintään OWASP-vähimmäisarvoilla. Jos ajoaika ei tarjoa sitä: scrypt, sitten bcrypt (kustannus niin, että tiivistys kestää ≥250 ms). PBKDF2 vain silloin, kun sertifiointi vaatii sitä.

Miksi tulosmerkkijonossa näkyy satunnainen suola? Suola ei ole salainen - se on tallennettu selkeänä PHC-merkkijonon sisään tarkoituksella, joten vahvistus tarvitsee vain merkkijonon ja ehdokassalasanan. Sen tehtävä on ainutkertaisuus, ei salassapito.

Onko variantilla väliä ($2a$ / $2b$ / $2y$)? ASCII-salasanoille ne tuottavat identtiset tiivisteet; $2a$ on 1990-luvun alkuperäinen, $2b$ korjasi harvinaisen etumerkin laajennusvirheen (2014), $2y$ on PHP:n merkki siitä, että korjaus on mukana. Vahvista hyväksyy kaikki kolme.

Kuinka kauan tiivistyksen pitäisi kestää? Noin 250-500 ms kirjautumista kohden palvelinlaitteistolla. Alle 100 ms ja offline-murtaminen on halpaa; yli 1 s ja käyttäjät valittavat ennen kuin turvallisuus paranee.

Voinko vahvistaa muualla tuotetun tiivisteen? Kyllä - liitä se ja anna ehdokassalasana. Tunnetut toimivat muodot: PHP password_hash (bcrypt $2y$ ja Argon2id), Python passlib, djangon argon2-tiivistäjä ja Tarsnapin scrypt-työkalun käyttämä scrypt-merkkijonomuoto.

Mitä "vertailu"-painike tekee? Se tiivistää nykyisen salasanan kerran jokaisella algoritmilla sivun oletusparametreilla ja raportoi kelloajan tässä selaimessa - tuntuma kustannuseroista, ei tarkka mittaus.