Wat is scrypt?

scrypt is een wachtwoord-hashfunctie, of sleutelafleidingsfunctie, die Colin Percival in 2009 heeft ontworpen en die is gepubliceerd als RFC 7914. Net als bcrypt en Argon2 is de functie bewust traag, zodat elke poging een aanvaller tijd kost. De functie is ook geheugenintensief: elke hash vult een groot geheugenblok en leest dit terug in een onvoorspelbare volgorde. Daardoor wordt kraken met GPU's en speciale chips veel duurder. scrypt wordt gebruikt voor wachtwoordopslag in veel webframeworks, in de standaardbibliotheken van Node.js, Python en Go, en in cryptocurrency-wallets zoals Ethereum-keystores.

Beschrijving van de tool

Deze tool hasht een wachtwoord met scrypt in je browser. De tool begint met een willekeurige salt en de instellingen die OWASP aanbeveelt voor wachtwoordopslag. Je kunt de salt, de kostenfactor (N), de blokgrootte (r), de parallelisatie (p) en de sleutellengte wijzigen. De hash is beschikbaar als PHC-string voor wachtwoordbibliotheken en als hex en Base64 voor code die de salt en parameters zelf opslaat.

Functies

  • Hasht een wachtwoord met scrypt, zoals gedefinieerd in RFC 7914
  • Maakt een willekeurige salt van 16 bytes, met een knop om een nieuwe te maken
  • Accepteert je eigen salt, zodat je een hash kunt reproduceren die elders is gemaakt
  • Stelt de kostenfactor (N) in van 2⁴ tot 2²⁰, evenals de blokgrootte (r), de parallelisatie (p) en de sleutellengte
  • Geeft de hash weer als PHC-string, hex en Base64
  • Toont de voortgang van trage hashes en waarschuwt wanneer de instellingen meer dan 1 GiB geheugen vereisen
  • Werkt in je browser, zodat het wachtwoord je apparaat nooit verlaat

Parameters

Parameter Standaard Beschrijving
Kostenfactor (N) 131072 (2¹⁷) Aantal geheugenblokken. Een verdubbeling verdubbelt de tijd en het geheugengebruik.
Blokgrootte (r) 8 Grootte van elk blok, 128 × r bytes. Heeft ook invloed op tijd en geheugengebruik.
Parallelisatie (p) 1 Aantal onafhankelijke uitvoeringen. Vermenigvuldigt de tijd, niet het geheugengebruik.
Sleutellengte 32 bytes Lengte van de hash.

Het benodigde geheugen is 128 × N × r bytes, oftewel 128 MiB met de standaardinstellingen.

Uitvoerformaten

De PHC-string bevat alles wat nodig is om het wachtwoord later te controleren: het algoritme, de parameters, de salt en de hash. De salt en de hash zijn gecodeerd in Base64 zonder opvulling:

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

ln is de logaritme met grondtal 2 van N, dus ln=17 betekent N = 131072. Dit is het formaat dat passlib voor Python, de Rust-crate scrypt en het Node.js-pakket @phc/scrypt lezen en schrijven.

De velden hex en Base64 bevatten alleen de hash, zoals geretourneerd door crypto.scrypt in Node.js, hashlib.scrypt in Python en scrypt.Key in Go. Sla de salt en de parameters erbij op.

Hoe het werkt

Het salt-veld wordt als tekst gelezen en gecodeerd als UTF-8, net als wanneer je een string-salt doorgeeft aan crypto.scrypt in Node.js. De willekeurige salt bestaat uit 16 willekeurige bytes, weergegeven als 32 hextekens. Die 32 tekens vormen de salt die wordt gehasht. Ook het wachtwoord wordt gecodeerd als UTF-8. De hash wordt berekend in een achtergrondthread, zodat de pagina responsief blijft. De berekening begint opnieuw wanneer je een invoer wijzigt.

Tips

  • Gebruik voor elk wachtwoord een nieuwe willekeurige salt. Hetzelfde wachtwoord met dezelfde salt levert altijd dezelfde hash op.
  • OWASP beveelt voor wachtwoordopslag minimaal N = 2¹⁷, r = 8 en p = 1 aan. Verhoog N zo ver als je server per aanmelding aankan.
  • Node.js beperkt scrypt standaard tot 32 MiB geheugen. Geef een hogere waarde voor maxmem door aan crypto.scrypt wanneer je N = 2¹⁷ of hoger gebruikt met r = 8.
  • Als je een hash van een ander systeem wilt controleren, voer dan hetzelfde wachtwoord, dezelfde salt en dezelfde parameters in en vergelijk de resultaten.