0Pricing
Security+ Academy · Lezione

Funzioni di derivazione delle chiavi: PBKDF2, bcrypt e Argon2

Confronti gli algoritmi di hashing delle password in base alla resistenza agli attacchi GPU e ASIC e comprenda come vengano calibrati i fattori di lavoro e la memory hardness.

Funzioni di derivazione delle chiavi: PBKDF2, bcrypt e Argon2 è una lezione Security+ Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Security+ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Security+ Academy include 4 lezioni in totale.

Perché l'hashing delle password è diverso

La memorizzazione delle password richiede una classe speciale di funzioni crittografiche chiamata funzione di hashing delle password (PHF) o funzione di derivazione delle chiavi (KDF). Gli hash crittografici tradizionali come SHA-256 sono progettati per essere veloci: una GPU moderna può calcolare miliardi di hash SHA-256 al secondo. Questa velocità è catastrofica per la memorizzazione delle password: un attaccante che ruba un database di hash può provare miliardi di combinazioni al secondo. Le KDF per password sono intenzionalmente lente e configurabili, così da rendere gli attacchi a forza bruta computazionalmente impraticabili, pur consentendo un accesso legittimo entro pochi millisecondi.

Il salting: sconfiggere le rainbow table

Prima dell'esistenza di KDF dedicate alle password, gli attaccanti usavano le rainbow table, ovvero associazioni precalcolate tra valori hash e password in chiaro. Un salt è un valore casuale univoco per ogni utente, anteposto o aggiunto alla password prima dell'hashing, che rende ogni hash unico anche quando le password sono identiche. I salt vengono memorizzati insieme all'hash nel database: non sono segreti, ma solo casuali. Un salt corretto deve essere: lungo almeno 16 byte, generato da un generatore di numeri casuali crittograficamente sicuro e memorizzato per ogni utente (mai riutilizzato tra account diversi).

PBKDF2: lo standard per le password

PBKDF2 (Password-Based Key Derivation Function 2) è definito nella RFC 8018 e approvato dal NIST. Funziona applicando ripetutamente una funzione HMAC, in genere HMAC-SHA-256, alla password e al salt, per un numero configurabile di iterazioni. Il numero di iterazioni è il fattore di lavoro: dal 2023 il NIST raccomanda almeno 600.000 iterazioni di PBKDF2-HMAC-SHA256. PBKDF2 è ampiamente utilizzato (Django, iOS Keychain, WPA2-PSK), ma presenta una debolezza: può essere implementato in modo efficiente sulle GPU, risultando meno resistente alle GPU rispetto alle alternative.

# PBKDF2 example (Python pseudocode concept)
# import hashlib
# dk = hashlib.pbkdf2_hmac(
#   'sha256',         # hash algorithm
#   b'password',      # password bytes
#   b'random_salt',   # salt bytes
#   600000            # iterations
# )

bcrypt: resistenza a memoria e CPU

bcrypt è stato progettato da Niels Provos e David Mazieres nel 1999 ed è tuttora ampiamente utilizzato. La sua innovazione principale è un fattore di costo (parametro rounds), in cui ogni incremento raddoppia il tempo di calcolo. bcrypt usa una versione modificata del cifrario Blowfish con una configurazione della chiave Eksblowfish che richiede molte risorse sia di CPU sia di memoria, rendendo l'accelerazione su GPU significativamente più difficile rispetto a PBKDF2. bcrypt limita inoltre l'input della password a 72 byte (le password più lunghe vengono troncate); per questo, in alcune implementazioni è necessario sottoporre prima le password lunghe a hashing con SHA-256.

# bcrypt cost factor
# Cost 10 = ~100ms on modern hardware
# Cost 12 = ~400ms
# Cost 14 = ~1600ms
# Each +1 doubles the work
# Recommended: cost 12-14 for web apps
# Command: htpasswd -bnBC 12 username password

Argon2: il vincitore moderno

Argon2 ha vinto la Password Hashing Competition nel 2015 ed è l'attuale raccomandazione di OWASP. È disponibile in tre varianti: Argon2d (più veloce, vulnerabile ai side-channel, ideale per le criptovalute), Argon2i (a tempo costante, ideale per l'hashing delle password) e Argon2id (ibrido, raccomandato per la maggior parte degli utilizzi). Argon2id è configurabile su tre dimensioni: costo temporale (iterazioni), costo di memoria (RAM richiesta) e parallelismo (thread). L'elevato fabbisogno di memoria rende estremamente difficile la parallelizzazione sulle GPU e completamente impraticabile l'uso di ASIC.

# Argon2id recommended parameters (OWASP 2023)
# Memory: 64MB (65536 KiB)
# Iterations: 3
# Parallelism: 4 threads
# Output length: 32 bytes
# argon2 -id -t 3 -m 16 -p 4 -l 32

Resistenza alla memoria: perché sconfigge gli attacchi GPU

Le GPU hanno migliaia di core, ma una quantità limitata di memoria per core: eccellono nel parallelizzare calcoli semplici che richiedono poca memoria. Le funzioni memory-hard come Argon2 e scrypt richiedono grandi quantità di RAM per ogni calcolo dell'hash. Se un attaccante vuole eseguire 10.000 calcoli Argon2id in parallelo, ciascuno dei quali richiede 64 MB di memoria, ha bisogno di 640 GB di RAM GPU, una quantità ben superiore a quella disponibile in qualsiasi cluster di GPU. Questa proprietà, chiamata resistenza alla memoria, costringe gli attaccanti a eseguire calcoli lenti e sequenziali oppure a sostenere costi hardware straordinari, rendendo gli attacchi antieconomici.

Regolazione del fattore di lavoro nella pratica

Il fattore di lavoro corretto dipende dall'hardware e dalla latenza accettabile. L'obiettivo generale è di 100-300 ms sull'hardware di produzione del server per ogni autenticazione. Con il miglioramento dell'hardware, dovrebbe aumentare il fattore di lavoro: per questo bcrypt e Argon2 memorizzano i parametri insieme all'hash, consentendo aggiornamenti trasparenti: al login successivo, verifichi la password e poi calcoli nuovamente l'hash con i nuovi parametri più elevati. OWASP mantiene i parametri minimi raccomandati aggiornati per PBKDF2, bcrypt e Argon2id, che dovrebbero essere verificati ogni anno.

scrypt: l'altra KDF resistente alla memoria

scrypt, progettato da Colin Percival nel 2009, è stata la prima KDF resistente alla memoria adottata su larga scala e viene utilizzata da Litecoin e da molti password manager. scrypt è parametrizzato da N (costo di CPU/memoria), r (dimensione del blocco) e p (fattore di parallelizzazione). Come Argon2, valori elevati di N richiedono grandi quantità di RAM per ogni calcolo. scrypt è considerato sicuro, ma Argon2id è generalmente preferito per le nuove applicazioni perché ha vinto la PHC ed è stato sottoposto a un'analisi crittografica più approfondita. Entrambe sono scelte accettabili.

Cosa NON usare: MD5, SHA-1 e SHA senza salt

Per le password non devono mai essere usati diversi approcci di hashing: MD5 (compromesso, miliardi di hash al secondo su hardware comune), SHA-1 (lo stesso problema), SHA-256 senza salt (veloce, rainbow table facilmente utilizzabili) e la cifratura semplice (reversibile: il furto della chiave equivale al furto di tutte le password). Violazioni storiche come quella di LinkedIn (2012) hanno utilizzato SHA-1 senza salt, esponendo 117 milioni di password che sono state decifrate in pochi giorni. Adobe (2013) ha cifrato le password invece di sottoporle a hashing: un fraintendimento fondamentale che ha esposto 153 milioni di account. Questi incidenti fanno parte degli argomenti d'esame di Security+.

Derivazione delle chiavi per la cifratura

Le KDF vengono utilizzate anche per derivare chiavi di cifratura dalle password, invece di memorizzare gli hash delle password. Quando un utente imposta una password principale per un archivio cifrato, l'applicazione usa una KDF per derivare la chiave di cifratura AES-256 effettiva da quella password. È per questo che i password manager possono decifrare localmente il Suo archivio: eseguono la KDF sulla password principale per ricostruire la chiave di cifratura, che non lascia mai il Suo dispositivo. HKDF (HMAC-based Key Derivation Function) è lo standard per derivare più chiavi da un singolo segreto ad alta entropia e viene utilizzato in TLS 1.3 per derivare le chiavi dell'handshake e dell'applicazione.

Credential stuffing e protezione tramite KDF

Gli attacchi di credential stuffing riutilizzano coppie nome utente/password sottratte durante una violazione per tentare l'accesso ad altri servizi. KDF robuste riducono la finestra utile per il cracking offline dopo una violazione: se l'attaccante deve impiegare 300 ms per ogni tentativo invece di pochi microsecondi, violare una password casuale di 10 caratteri diventa computazionalmente irrealizzabile. Tuttavia, le KDF non proteggono dal riutilizzo delle password tra siti diversi: a questo scopo è necessario che gli utenti utilizzino password uniche. La combinazione di password uniche + archiviazione con Argon2id + MFA rende gli attacchi basati sulle credenziali praticamente inefficaci.

Verifica rapida

Verifichi la Sua comprensione dei concetti di CompTIA Security+ (SY0-701) trattati in questa lezione.

Riepilogo della lezione

In questa lezione ha imparato che: le KDF per password sono intenzionalmente lente e dispongono di fattori di lavoro regolabili per rendere computazionalmente irrealizzabili gli attacchi brute-force offline; le funzioni memory-hard come Argon2id e scrypt contrastano la parallelizzazione tramite GPU richiedendo una grande quantità di RAM per ogni calcolo; e MD5, SHA-1 e gli hash non salati sono del tutto inadeguati per l'archiviazione delle password, come dimostrato da numerose violazioni di alto profilo. Ora esamineremo la crittografia post-quantistica e gli algoritmi selezionati da NIST per sostituire RSA ed ECC.

Domande Frequenti

La lezione «Funzioni di derivazione delle chiavi: PBKDF2, bcrypt e Argon2» è gratuita?

Sì — il testo completo di «Funzioni di derivazione delle chiavi: PBKDF2, bcrypt e Argon2» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Security+ Academy, passa a CoddyKit PRO. Il corso Security+ Academy include 4 lezioni in totale.

Cosa imparerò in «Funzioni di derivazione delle chiavi: PBKDF2, bcrypt e Argon2»?

Confronti gli algoritmi di hashing delle password in base alla resistenza agli attacchi GPU e ASIC e comprenda come vengano calibrati i fattori di lavoro e la memory hardness. Eserciti Security+ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Security+ Academy?

Non è richiesta alcuna esperienza precedente. Security+ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Funzioni di derivazione delle chiavi: PBKDF2, bcrypt e Argon2»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Security+ Academy?

Sì. Ogni lezione Security+ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Handshake TLS 1.3 e ripresa 0-RTT
  2. Crittografia autenticata: AES-GCM e ChaCha20-Poly1305
  3. Funzioni di derivazione delle chiavi: PBKDF2, bcrypt e Argon2
  4. Crittografia post-quantistica: CRYSTALS-Kyber e Dilithium
← Torna a Security+ Academy