Hva er scrypt?

scrypt er en passordhashingsfunksjon, eller en nøkkelavledningsfunksjon, utviklet av Colin Percival i 2009 og publisert som RFC 7914. I likhet med bcrypt og Argon2 er den med vilje langsom, slik at hvert gjetningsforsøk koster en angriper tid. Den er også minnekrevende: Hver hash fyller en stor minneblokk og leser den tilbake i en uforutsigbar rekkefølge, noe som gjør knekking med GPU-er og spesialtilpassede brikker langt dyrere. scrypt brukes til lagring av passord i mange nettrammeverk, i standardbibliotekene til Node.js, Python og Go, og i kryptovaluta-lommebøker, for eksempel Ethereum-nøkkellagre.

Verktøybeskrivelse

Dette verktøyet hasher et passord med scrypt i nettleseren din. Det starter med et tilfeldig salt og innstillingene OWASP anbefaler for lagring av passord, og du kan endre saltet, kostnaden (N), blokkstørrelsen (r), parallelliseringen (p) og nøkkellengden. Hashen er tilgjengelig som en PHC-streng for passordbiblioteker, samt i hex- og Base64-format for kode som lagrer saltet og parameterne separat.

Funksjoner

  • Hasher et passord med scrypt slik funksjonen er definert i RFC 7914
  • Oppretter et tilfeldig salt på 16 byte, med en knapp for å lage et nytt
  • Lar deg bruke ditt eget salt for å gjenskape en hash som er laget et annet sted
  • Angir kostnaden (N) fra 2⁴ til 2²⁰, blokkstørrelsen (r), parallelliseringen (p) og nøkkellengden
  • Viser hashen som en PHC-streng, i hex-format og i Base64-format
  • Viser fremdriften for langsomme hasher og varsler når innstillingene krever mer enn 1 GiB minne
  • Kjører i nettleseren din, slik at passordet aldri forlater enheten din

Parametere

Parameter Standardverdi Beskrivelse
Kostnad (N) 131072 (2¹⁷) Antall minneblokker. En dobling gir dobbelt så lang kjøretid og dobbelt så mye minne.
Blokkstørrelse (r) 8 Størrelsen på hver blokk, 128 × r byte. Påvirker også kjøretid og minnebruk.
Parallellisering (p) 1 Antall uavhengige kjøringer. Øker kjøretiden, men ikke minnebruken.
Nøkkellengde 32 byte Lengden på hashen.

Minnebehovet er 128 × N × r byte, som tilsvarer 128 MiB med standardverdiene.

Utdataformater

PHC-strengen inneholder alt som trengs for å kontrollere passordet senere: algoritmen, parameterne, saltet og hashen. Saltet og hashen er kodet i Base64 uten utfylling:

$scrypt$ln=17,r=8,p=1$<salt>$<hash>

ln er logaritmen med grunntall 2 av N, så ln=17 betyr at N = 131072. Dette er formatet som Python-biblioteket passlib, Rust-craten scrypt og Node.js-pakken @phc/scrypt leser og skriver.

Hex- og Base64-feltene inneholder bare hashen, slik den returneres av crypto.scrypt i Node.js, hashlib.scrypt i Python og scrypt.Key i Go. Lagre saltet og parameterne sammen med hashen.

Slik fungerer det

Saltfeltet leses som tekst og kodes som UTF-8, på samme måte som når du sender en streng som salt til Node.js crypto.scrypt. Det tilfeldige saltet består av 16 tilfeldige byte skrevet som 32 heksadesimale tegn, og disse 32 tegnene er saltet som hashes. Passordet kodes også som UTF-8. Hashen beregnes i en bakgrunnstråd, slik at siden forblir responsiv, og beregningen starter på nytt når du endrer en inndataverdi.

Tips

  • Bruk et nytt, tilfeldig salt for hvert passord. Samme passord med samme salt gir alltid samme hash.
  • OWASP anbefaler minst N = 2¹⁷, r = 8, p = 1 for lagring av passord. Øk N så mye serveren din har kapasitet til for hver innlogging.
  • Node.js begrenser scrypt til 32 MiB minne som standard. Angi en høyere maxmem for crypto.scrypt når du bruker N = 2¹⁷ eller høyere med r = 8.
  • Hvis du vil kontrollere en hash fra et annet system, oppgir du samme passord, salt og parametere og sammenligner resultatene.