Adgangskodehash-generator og -verifikator

Hash og verificér adgangskoder med bcrypt, scrypt, Argon2id og PBKDF2 helt i browseren — generér PHC-formaterede strenge, kontrollér en kandidatadgangskode mod et eksisterende hash, og undersøg de parametre, der er gemt i det. Intet uploades.
Kun til testadgangskoder. Rigtige brugeradgangskoder bør aldrig indsættes på nogen webside. Værktøjet kører helt i browseren — strengene forlader aldrig fanen — men et rigtigt databrud begynder med et enkelt indsæt.
bcrypt-omkostning (2^cost runder)
bcrypt-variant varianten ændrer kun præfikset; selve hashet er identisk
scrypt N (CPU-omkostning)
scrypt r / p r =   p = blokstørrelse 128·r bytes; hukommelse = 128·N·r bytes (N=214, r=8 → 16 MiB)
Argon2id m (hukommelse)
Argon2id t / p t =   p = t = gennemløb; p = parallelisme (baner)
PBKDF2-PRF
PBKDF2-iterationer  OWASP 2023: 600.000 for HMAC-SHA-256 (1.300.000 for SHA-1, 210.000 for SHA-384/512)
Outputlængde (bytes)  bcrypt-output er fast på 23 bytes (31 bcrypt-base64-tegn)
AlgoritmeParametreHukommelseOutputlængdeTid (denne browser)
bcryptomkostning 124 KiB23 bytes-
scryptN=214, r=8, p=116 MiB32 bytes-
Argon2idm=19 MiB, t=2, p=119 MiB32 bytes-
PBKDF2HMAC-SHA-256, 600.000 iterationer~032 bytes-
Parameter-huskeliste (OWASP Password Storage Cheat Sheet, minimumskrav fra 2023)
AlgoritmeMinimumNoter
Argon2idm = 19 MiB (19.456 KiB), t = 2, p = 1foretrukken; hukommelseskrævende
scryptN = 214, r = 8, p = 1hukommelseskrævende (16 MiB som minimum)
bcryptomkostning = 10kun arbejdsfaktor; grænse på 72 bytes for adgangskoden
PBKDF2-HMAC-SHA256600.000 iterationerkun iterationshårdhed — GPU-venlig, sidste valg
Standardværdierne på denne side ligger på eller over alle minimumskrav. Til produktion vælges Argon2id først, scrypt eller bcrypt, hvis den ikke er tilgængelig, og PBKDF2 kun af FIPS-compliance-grunde.
PHP-interop — password_hash($pw, PASSWORD_BCRYPT) udsender $2y$10$...: indsæt den under Verificér med kandidatadgangskoden, så svarer siden præcis, som password_verify() ville. Output fra PASSWORD_ARGON2ID ($argon2id$v=19$m=65536,t=4,p=1$...) verificeres også. PHC-strenge fra passlib, django-argon2 og indpakning via crypto.scrypt kan også læses.
Selvtest
Kører sidens motor igen mod offentlige testvektorer: crypt_blowfish-testsuiten for bcrypt, node/OpenSSL-genererede scrypt- og Argon2id-strenge, PBKDF2-vektorerne fra RFC 6070 og det offentlige SHA-256-sæt, samt generér-derefter-verificér-rundture i alle algoritmer og negative tests (forkert adgangskode skal fejle, misdannede strenge skal afvises). Intet sendes nogen steder hen.
Adgangskodehashing forklaret fra bunden
I én sætning: et adgangskodehash er bevidst langsomt (og helst hukommelseskrævende), så tyveri af databasen ikke lader en angriber afprøve milliarder af gæt pr. sekund — det modsatte mål af et hurtigt hash som SHA-256, der er bygget til hastighed.
Hvorfor ikke bare SHA-256 adgangskoden?

SHA-256 på en moderne GPU kører med milliarder af gæt pr. sekund. En adgangskode på 8 tegn har langt under 1013 kombinationer — timer med GPU-tid, minutter på en stor rig. Adgangskodehashfunktioner (KDF'er) bekæmper dette med omkostningsparametre: bcrypt gentager sin kerne 2cost gange, PBKDF2 itererer HMAC hundredtusinder af gange, og scrypt og Argon2id kræver desuden megabytes hukommelse pr. gæt, så GPU'er (hurtige, men hukommelsesfattige pr. kerne) mister deres fordel. Et salt — tilfældigt og gemt i klartekst inde i hashstrengen — forhindrer forudberegnede regnbuetabeller og tvinger hvert gæt til at blive beregnet på ny for hver bruger.

De fire algoritmer på denne side
AlgoritmeÅrHårdhedSignaturformatPas på
bcrypt1999CPU (2cost nøgleopsætninger)$2b$12$ + 22-tegns salt + 31-tegns hashgrænse på 72 bytes for adgangskoden (alt ud over 72 ignoreres stille); NUL-byte afslutter adgangskoden i den oprindelige C-implementering
PBKDF22000 (RFC 2898/8018)CPU (iterationer)$pbkdf2-sha256$i=600000$ + salt + hash (passlib-stil)ingen hukommelsesomkostning — GPU'er og ASIC'er elsker den; kun iterationsantallet kan justeres
scrypt2009 (RFC 7914)CPU + hukommelse (128·N·r bytes)$scrypt$ln=14,r=8,p=1$ + salt + hashN skal være en potens af to; hukommelsen vokser lineært med r
Argon2id2015 (PHC-vinderen, RFC 9106)CPU + hukommelse (m KiB, t gennemløb)$argon2id$v=19$m=19456,t=2,p=1$ + salt + hashArgon2i (datauafhængig) kontra Argon2d (dataafhængig) kontra Argon2id (hybrid) — vælg altid id, medmindre man ved, hvorfor ikke
Hukommelseshårdhed kontra beregningshårdhed

En GPU har tusindvis af kerner, men hver kerne har kun adgang til lidt hurtig hukommelse. En KDF, der kræver 19 MiB arbejdshukommelse pr. gæt, begrænser en angriber til så mange parallelle gæt, som vedkommende har 19-MiB-bidder hukommelse til — derfor kan Argon2id med 19 MiB i praksis være stærkere end bcrypt med omkostning 15, selvom den kræver mindre tid på den bærbare. PBKDF2 har intet svar på dette: dens eneste indstilling er antallet af iterationer, og silicium skalerer det lineært.

Læsning af en PHC-streng

Det modular-crypt-/PHC-format er selvbeskrivende: i $argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf... er felterne algoritme, version, parametre (m = hukommelse i KiB, t = gennemløb, p = baner), base64-salt og base64-hash. bcrypt er ældre end standarden og bruger sin egen kompakte form: $2b$-variant, 12 som omkostning, derefter salt og hash i bcrypts egen base64-alfabet (./A-Za-z0-9). Denne sides Verificér accepterer alle disse og viser de analyserede felter — indsæt et hvilket som helst hash, man støder på, og se, hvordan det splittes op.

Almindelige fejl
  • Hurtigt hash til adgangskoder. MD5/SHA-1/SHA-256-adgangskodekolonner falder for standard-GPU'er ved milliarder af gæt pr. sekund. Brug Hash-generatoren til filer og data; brug denne sides algoritmer til adgangskoder.
  • At dele et salt. Ét salt til alle brugere betyder, at ens adgangskoder får ens hashes, og regnbuetabeller kommer igen. Hver hash her får et nyt, tilfældigt 16-byte-salt.
  • At ignorere bcrypts 72 bytes. "a"*100 og "a"*72 giver identiske hashes — halen kasseres. Denne side advarer i inputfeltet, når adgangskoden overstiger 72 bytes. Argon2 har ingen sådan grænse.
  • At sammenligne hashes med == i egen kode. Verifikation skal være konstant-tid; sidens motor gør det internt (den genberegner og sammenligner de gemte bytes), men kopieres fremgangsmåden, skal en konstant-tid-sammenligning bruges.
  • At justere parametre på en hurtig udviklingsmaskine. Sigt efter ca. 250–500 ms hashing på produktionsbrugernes medianhardware, ikke på udviklerens arbejdsstation. Benchmark-knappen viser, hvad denne browser faktisk oplever.
  • Genhashing ved hvert login-tjek. Verificér først; genhash kun (fx for at hæve omkostningen) efter en vellykket verifikation, og gem den nye streng. PHP-funktionen password_needs_rehash() findes netop til dette.
Ofte stillede spørgsmål

Hvilken skal man vælge? Argon2id med mindst OWASP-minimum. Hvis miljøet ikke tilbyder den: scrypt, derefter bcrypt (med en omkostning, så hashing tager ≥250 ms). PBKDF2 kun hvor certificering kræver det.

Hvorfor vises et tilfældigt salt i outputstrengen? Saltet er ikke en hemmelighed — det gemmes med vilje i klartekst inde i PHC-strengen, så verifikation kun kræver strengen og kandidatadgangskoden. Dets opgave er entydighed, ikke hemmeligholdelse.

Betyder varianten noget ($2a$ / $2b$ / $2y$)? For ASCII-adgangskoder giver de identiske hashes; $2a$ er den oprindelige fra 1990'erne, $2b$ rettede en sjælden fortegnsudvidelsesfejl (2014), og $2y$ er PHP's markering af, at rettelsen er til stede. Verificér accepterer alle tre.

Hvor lang tid bør et hash tage? Cirka 250–500 ms pr. login på serverhardware. Under 100 ms er offline-knæk billigt; over 1 s klager brugerne, før sikkerheden bliver bedre.

Kan jeg verificere et hash, der er lavet andetsteds? Ja — indsæt det, og angiv kandidatadgangskoden. Kendte, gode formater: PHP password_hash (bcrypt $2y$ og Argon2id), Python passlib, Djangos argon2-hasher og scrypt-strengformatet, som Tarsnaps scrypt-værktøj bruger.

Hvad gør knappen "benchmark"? Den hasher den aktuelle adgangskode én gang med hver algoritme ved sidens standardparametre og rapporterer den forløbne tid i denne browser — en fornemmelse for forskelle i omkostning, ikke en præcis måling.