Key derivation function
Una funzione di derivazione delle chiavi (KDF) è un algoritmo crittografico che deriva uno o più set di materiale per la codifica da un segreto esistente, ad esempio una chiave condivisa, il risultato di un accordo sulla chiave o una password, insieme alle informazioni sul contesto e ad altri parametri.[1] I KDF consentono a un protocollo di trasformare un segreto in chiavi della lunghezza richiesta e di assegnare chiavi separate a scopi separati.
Il termine copre due classi correlate ma distinte. UN KDF basato su chiavi parte da un input che ha già una sostanziale forza crittografica. UN KDF basato su password parte da una password o passphrase selezionata da un essere umano e aumenta deliberatamente il costo del test delle ipotesi. Confondere i due può produrre progetti insicuri: un KDF generale e veloce non rende una password debole resistente all'ipotesi offline.
Derivazione basata su chiavi
I protocolli spesso ottengono un segreto iniziale attraverso un'operazione di accordo sulla chiave e quindi necessitano di chiavi diverse per la crittografia, l'autenticazione del messaggio o direzioni distinte di una connessione. Un KDF può combinare il segreto con etichette e contesto, come identificatori di protocollo, identità di parti o dati di trascrizione, in modo che gli output per scopi diversi siano separati.
NIST SP 800-108 specifica le costruzioni di contatore, feedback e doppia pipeline basate su funzioni pseudocasuali tra cui HMAC, CMAC e KMAC.[2] La costruzione esatta e i suoi input fanno parte di una specifica del protocollo; il semplice hashing di un segreto senza separazione del dominio potrebbe non fornire le proprietà richieste.
Estrai ed espandi
HKDF è un KDF basato su HMAC standardizzato in RFC 5869. Segue un estrai-poi-espandi progetto. La fase di estrazione converte materiale di codifica di input potenzialmente non uniforme in una chiave pseudocasuale di lunghezza fissa. La fase di espansione deriva uno o più output associando informazioni di contesto facoltative.[3]
HKDF è destinato al materiale di codifica crittografica come un risultato Diffie-Hellman. È deliberatamente efficiente e non sostituisce uno schema di hashing della password quando l'input può essere indovinato da un piccolo dizionario.
Derivazione basata su password
Un KDF basato su password combina una password con parametri salt e di costo. Il sale viene normalmente conservato insieme al risultato e non è necessario che sia segreto. Il suo scopo è fare in modo che password identiche producano output diversi e impedire che una tabella precalcolata venga riutilizzata su più record. Il fattore lavoro rende ogni ipotesi più costosa sia per il sistema legittimo che per un utente malintenzionato.[4]
PBKDF2 applica ripetutamente una funzione pseudocasuale ed è specificata da PKCS #5 e dalle linee guida NIST. Il suo principale costo regolabile è il conteggio delle iterazioni. Tale parametro deve essere selezionato per l'applicazione e l'hardware e dovrebbe essere aumentato nel tempo laddove la compatibilità lo consente; non esiste un conteggio di iterazioni permanente appropriato per ogni sistema.
I moderni schemi di hashing delle password possono anche imporre un costo di memoria configurabile. Le funzioni che richiedono molta memoria mirano a rendere costose le ipotesi su larga scala non solo nelle operazioni del processore ma anche in memoria e larghezza di banda. scrypt, Argon2 E Lyra2 sono esempi di disegni in questa famiglia. RFC 9106 specifica Argon2 e consiglia la variante ibrida Argon2id per l'hashing generale delle password, con profili scelti in base alla memoria disponibile e alla latenza.[5]
Usi
I KDF vengono utilizzati per:
- ricavare chiavi di traffico e materiale di inizializzazione dopo uno scambio di chiavi;
- creare chiavi di crittografia e autenticazione separate da un master secret;
- associare le chiavi a un protocollo, sessione, identità o scopo;
- ricavare una chiave di crittografia dell'archiviazione da una passphrase;
- memorizzare un verificatore derivato da una password anziché dalla password stessa; E
- produrre una chiave della lunghezza esatta richiesta da un'altra primitiva crittografica.
Un verificatore di password e una chiave di crittografia possono entrambi essere risultati di una derivazione basata su password, ma i modelli di minaccia circostanti differiscono. La verifica della password deve limitare i tentativi online e proteggere il database del verificatore; la crittografia dell'archiviazione deve anche considerare il modo in cui la chiave derivata viene cancellata, conservata e recuperata.
Considerazioni sulla sicurezza
La sicurezza di un KDF dipende dalla forza del suo input, dalla costruzione, dalle scelte dei parametri e dal legame con il contesto. Un KDF non può creare entropia assente da una password indovinabile. I sali impediscono il precalcolo incrociato dei record ma non è necessario indovinarli e non rallentano da soli un attacco mirato.
Per l'uso basato su password, i parametri di costo dovrebbero essere calibrati sulla distribuzione effettiva in modo che l'uso legittimo rimanga accettabile mentre le ipotesi sono costose. Le implementazioni devono inoltre vincolare i parametri controllati dagli aggressori per evitare la negazione del servizio, confrontare i verificatori delle password senza perdere informazioni utili sui tempi e migrare i vecchi set di parametri dopo l'autenticazione riuscita. Un valore segreto lato server, a volte chiamato pepper, può aggiungere un livello di protezione separato ma non sostituisce un salt univoco o una funzione di hashing della password adeguata.
Per l'uso basato su chiavi, le applicazioni dovrebbero seguire il KDF definito dal loro protocollo piuttosto che inventare una nuova composizione. Il riutilizzo di una chiave derivata per algoritmi non correlati o l'omissione del contesto del protocollo può impedire la separazione tra gli usi.
Norme e sviluppo storico
Il primo sistema di archiviazione delle password Unix è stato un importante predecessore dei moderni KDF basati su password. Il resoconto di Robert Morris e Ken Thompson del 1979 descriveva a cripta design che utilizzava i primi otto caratteri della password come chiave, applicava un calcolo DES modificato 25 volte e selezionava una delle 4.096 varianti con un salt a 12 bit.[6] Il sale ha frustrato il riutilizzo di un dizionario precalcolato in tutti gli account, mentre il calcolo ripetuto ha aumentato il costo di ogni ipotesi sull'hardware contemporaneo. I limiti fissi e la crescente potenza di calcolo alla fine hanno reso questo schema inadatto alla moderna protezione tramite password.
Successivamente gli hash delle password hanno introdotto parametri di costo regolabili e primitive più forti. Bcrypt ha aggiunto un fattore di lavoro adattabile negli anni ’90; scrypt ha aggiunto un costo di memoria configurabile; e il concorso Password Hashing ha selezionato Argon2, assegnando un riconoscimento speciale a Catena, Lyra2, Makwa e yescrypt.[7] Queste funzioni non sono intercambiabili solo perché ciascuna può elaborare una password: le applicazioni devono seguire la codifica, i parametri e le regole di migrazione della funzione selezionata.
NIST SP 800-132 specifica la derivazione basata su PBKDF2 per la protezione dei dati archiviati e riporta un avviso che il NIST prevede di rivedere la pubblicazione.[8] L'attuale guida NIST sull'identità digitale richiede l'hashing delle password salate con uno schema adeguato e raccomanda una funzione di memoria pesante. Questi requisiti si applicano ai verificatori di password; non dovrebbero essere generalizzati affermando che ogni KDF crittografico deve essere lento o avere molta memoria.[9]
Riferimenti
- ↑ NIST Computer Security Resource Center, “Key-derivation function”, accessed 13 September 2026
- ↑ NIST SP 800-108 Rev. 1, Recommendation for Key Derivation Using Pseudorandom Functions, updated 2 February 2024
- ↑ Hugo Krawczyk and Pasi Eronen, RFC 5869, “HMAC-based Extract-and-Expand Key Derivation Function”, May 2010
- ↑ K. Moriarty, B. Kaliski and A. Rusch, RFC 8018, PKCS #5: Password-Based Cryptography Specification Version 2.1, January 2017
- ↑ Alex Biryukov et al., RFC 9106, “Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications”, September 2021
- ↑ Robert Morris and Ken Thompson, “Password Security: A Case History”, Communications of the ACM, November 1979; Niels Provos, “Bcrypt at 25: A Retrospective on Password Security”, USENIX, 22 May 2023
- ↑ Password Hashing Competition, “Password Hashing Competition”, accessed 13 September 2026
- ↑ NIST SP 800-132, Recommendation for Password-Based Key Derivation: Part 1: Storage Applications, December 2010
- ↑ NIST SP 800-63B, Digital Identity Guidelines: Authentication and Authenticator Management, 2025
