Vad är scrypt?

scrypt är en lösenordshashningsfunktion, eller nyckelhärledningsfunktion, som Colin Percival utformade 2009 och publicerade som RFC 7914. Precis som bcrypt och Argon2 är den långsam med flit, så varje gissning kostar en angripare tid. Den är också minneshård: varje hash fyller ett stort minnesblock och läser tillbaka det i en oförutsägbar ordning, vilket gör det mycket dyrare att knäcka lösenord med GPU:er och specialbyggda kretsar. scrypt används för lösenordslagring i många webbramverk, i standardbiblioteken för Node.js, Python och Go samt i kryptovalutaplånböcker, till exempel Ethereums nyckellager.

Verktygsbeskrivning

Det här verktyget skapar en hash av ett lösenord med scrypt i webbläsaren. Det börjar med ett slumpmässigt salt och de inställningar som OWASP rekommenderar för lösenordslagring. Du kan ändra saltet, kostnaden (N), blockstorleken (r), parallelliseringen (p) och nyckellängden. Hashen kan hämtas som en PHC-sträng för lösenordsbibliotek och som hex och Base64 för kod som lagrar saltet och parametrarna separat.

Funktioner

  • Skapar en hash av ett lösenord med scrypt enligt definitionen i RFC 7914
  • Skapar ett slumpmässigt salt på 16 byte, med en knapp för att skapa ett nytt
  • Tar emot ett eget salt, så att du kan återskapa en hash som skapats någon annanstans
  • Ställer in kostnaden (N) från 2⁴ till 2²⁰, blockstorleken (r), parallelliseringen (p) och nyckellängden
  • Ger hashen som en PHC-sträng, hex och Base64
  • Visar förloppet för långsamma hashberäkningar och varnar när inställningarna kräver mer än 1 GiB minne
  • Körs i webbläsaren, så lösenordet lämnar aldrig din enhet

Parametrar

Parameter Standardvärde Vad den gör
Kostnad (N) 131072 (2¹⁷) Antal minnesblock. Om värdet fördubblas fördubblas tids- och minnesåtgången.
Blockstorlek (r) 8 Storleken på varje block, 128 × r byte. Påverkar också tids- och minnesåtgången.
Parallellisering (p) 1 Antal oberoende körningar. Multiplicerar tidsåtgången, men inte minnesåtgången.
Nyckellängd 32 byte Hashens längd.

Minnesåtgången är 128 × N × r byte, vilket med standardvärdena motsvarar 128 MiB.

Utdataformat

PHC-strängen innehåller allt som behövs för att kontrollera lösenordet senare: algoritmen, parametrarna, saltet och hashen. Saltet och hashen anges i Base64 utan utfyllnad:

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

ln är 2-logaritmen av N, så ln=17 betyder att N = 131072. Det här formatet kan läsas och skrivas av Pythons passlib, Rust-craten scrypt och Node.js-paketet @phc/scrypt.

Fälten för hex och Base64 innehåller bara hashen, precis som den returneras av crypto.scrypt i Node.js, hashlib.scrypt i Python och scrypt.Key i Go. Lagra saltet och parametrarna tillsammans med hashen.

Så fungerar det

Saltfältet läses som text och kodas som UTF-8, på samma sätt som när en saltsträng skickas till Node.js crypto.scrypt. Det slumpmässiga saltet består av 16 slumpmässiga byte som skrivs som 32 hextecken, och det är dessa 32 tecken som används för att skapa hashen. Lösenordet kodas också som UTF-8. Hashen beräknas i en bakgrundstråd så att sidan förblir responsiv, och beräkningen startar om när du ändrar någon indata.

Tips

  • Använd ett nytt slumpmässigt salt för varje lösenord. Samma lösenord med samma salt ger alltid samma hash.
  • OWASP rekommenderar minst N = 2¹⁷, r = 8, p = 1 för lösenordslagring. Höj N så mycket som servern klarar av per inloggning.
  • Node.js begränsar scrypt till 32 MiB minne som standard. Ange ett högre maxmem till crypto.scrypt när du använder N = 2¹⁷ eller högre med r = 8.
  • Om du vill kontrollera en hash från ett annat system anger du samma lösenord, salt och parametrar och jämför resultaten.