Che cos’è scrypt?

scrypt è una funzione di hashing delle password, o funzione di derivazione delle chiavi, progettata da Colin Percival nel 2009 e pubblicata come RFC 7914. Come bcrypt e Argon2, è volutamente lenta, così ogni tentativo costa tempo all’attaccante. È anche memory-hard: ogni hash riempie un blocco di memoria di grandi dimensioni e lo rilegge in un ordine imprevedibile, rendendo molto più costoso violare le password con GPU e chip personalizzati. scrypt viene usato per memorizzare le password in molti framework web, nelle librerie standard di Node.js, Python e Go e in wallet di criptovalute, come gli archivi di chiavi di Ethereum.

Descrizione dello strumento

Questo strumento calcola l’hash di una password con scrypt nel browser. Inizia con un salt casuale e le impostazioni che OWASP raccomanda per la memorizzazione delle password; puoi modificare il salt, il costo (N), la dimensione del blocco (r), il parallelismo (p) e la lunghezza della chiave. L’hash è disponibile come stringa PHC, per le librerie di gestione delle password, e in formato esadecimale e Base64, per il codice che memorizza autonomamente il salt e i parametri.

Funzionalità

  • Calcola l’hash di una password con scrypt, come definito in RFC 7914
  • Crea un salt casuale di 16 byte e include un pulsante per generarne uno nuovo
  • Accetta un salt personalizzato per riprodurre un hash generato altrove
  • Imposta il costo (N) da 2⁴ a 2²⁰, la dimensione del blocco (r), il parallelismo (p) e la lunghezza della chiave
  • Fornisce l’hash come stringa PHC, in formato esadecimale e Base64
  • Mostra l’avanzamento degli hash lenti e avvisa quando le impostazioni richiedono più di 1 GiB di memoria
  • Funziona nel browser, così la password non lascia mai il tuo dispositivo

Parametri

Parametro Predefinito Descrizione
Costo (N) 131072 (2¹⁷) Numero di blocchi di memoria. Raddoppiandolo raddoppiano il tempo e la memoria.
Dimensione del blocco (r) 8 Dimensione di ogni blocco, 128 × r byte. Aumenta anche il tempo e la memoria.
Parallelismo (p) 1 Numero di esecuzioni indipendenti. Aumenta il tempo, ma non la memoria.
Lunghezza della chiave 32 byte Lunghezza dell’hash.

La memoria necessaria è pari a 128 × N × r byte, cioè 128 MiB con i valori predefiniti.

Formati di output

La stringa PHC contiene tutto ciò che serve per verificare la password in seguito: l’algoritmo, i parametri, il salt e l’hash; salt e hash sono codificati in Base64 senza padding:

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

ln è il logaritmo in base 2 di N, quindi ln=17 significa N = 131072. Questo è il formato che passlib per Python, il crate Rust scrypt e il pacchetto Node.js @phc/scrypt leggono e scrivono.

I campi esadecimale e Base64 contengono solo l’hash, come restituito da crypto.scrypt in Node.js, hashlib.scrypt in Python e scrypt.Key in Go. Memorizza accanto all’hash il salt e i parametri.

Come funziona

Il campo del salt viene letto come testo e codificato in UTF-8, come quando si passa un salt di tipo stringa a crypto.scrypt di Node.js. Il salt casuale è composto da 16 byte casuali, rappresentati da 32 caratteri esadecimali; sono questi 32 caratteri a essere usati per calcolare l’hash. Anche la password viene codificata in UTF-8. L’hash viene calcolato in un thread in background, così la pagina rimane reattiva; il calcolo riparte quando modifichi un qualsiasi dato di input.

Suggerimenti

  • Usa un nuovo salt casuale per ogni password. La stessa password con lo stesso salt produce sempre lo stesso hash.
  • OWASP raccomanda almeno N = 2¹⁷, r = 8, p = 1 per memorizzare le password. Aumenta N il più possibile, compatibilmente con le risorse che il tuo server può dedicare a ogni accesso.
  • Per impostazione predefinita, Node.js limita scrypt a 32 MiB di memoria. Passa un valore maxmem più alto a crypto.scrypt quando usi N = 2¹⁷ o superiore con r = 8.
  • Per verificare un hash proveniente da un altro sistema, inserisci la stessa password, lo stesso salt e gli stessi parametri, quindi confronta i risultati.