Il documento dell’Agenzia per la Cybersicurezza nazionale e del Garante Privacy

Linee guida funzioni crittografiche

Conservazione delle password

 

Versione 1.0, 7 dicembre 2023, prima pubblicazione

https://www.garanteprivacy.it/home/docweb/-/docweb-display/docweb/9962240

Introduzione

L’accesso ai sistemi prevede, pressoché sempre, una procedura di autenticazione informatica, anche a più fattori (MFA), dei quali uno è comunemente una password1.

La gestione dei sistemi e servizi deve prevedere misure tecniche e organizzative efficaci per l’archiviazione, la conservazione e l’utilizzo delle password, soprattutto per evitare che, laddove esfiltrati, possano essere attaccati.

Il documento in esame raccomanda e suggerisce le funzioni crittografiche ritenute attualmente più sicure per la conservazione.

Nella seconda parte il documento analizza il concetto di password hashing e le proprietà che esso deve avere per resistere ad eventuali attacchi, mentre nel capitolo terzo e quarto si analizzano gli algoritmi più comuni e si suggeriscono quelli maggiormente raccomandati.

Questo articolo vuole essere semplicemente un sunto del documento tecnico, destinato prevalentemente alle funzioni IT che si occupano della conservazione delle chiavi di accesso ai sistemi e ai servizi.

Password hashing

Una funzione di hash prende in entrata, in input, una stringa di bit di lunghezza arbitraria (ossia di qualsiasi lunghezza) e restituisce un digest, una stringa di bit di lunghezza fissa (una serie di caratteri apparentemente casuali).

Il procedimento è unidirezionale, non invertibile: significa che è computazionalmente estremamente difficile che dato un output, un digest, sia possibile trovare l’input che lo ha creato.

Questa caratteristica rende le funzioni di hash adatte alla conservazione delle password.

Invece di memorizzare in archivio le password “in chiaro”, si salva il loro digest.

E’ estremamente difficile risalire dal digest alla password.

E’ facile verificarne la correttezza al momento dell’accesso dell’utente.

Il sistema applica alla password inserita dall’utente la stessa funzione di hash usata in origine per creare il digest.

Il nuovo digest così creato viene confrontato con quello salvato nel database: se non sono uguali la password è errata.

Il sistema, in sostanza, non decodifica nulla ma calcola solo un digest e lo confronta con un altro che ha già.

Criticità

L’hashing aumenta la sicurezza, ma presenta comunque dei rischi in caso di data breach, laddove gli elenchi di hash possono trapelare ed essere sottoposti ad attacchi di forza bruta o dizionario, con il fine di trovare corrispondenze di password comuni nei digest2.

Un rischio addizionale è che gli hash identici rivelano gli utenti con password uguali.

È importante non utilizzare direttamente le comuni funzioni di hash crittografiche, ottimizzate per effettuare calcoli in maniera molto rapida (così rendendo eventuali attacchi molto più veloci).

 

Come fare

Gli algoritmi di hashing da utilizzare devono avere:

  • complessità computazionale (rapidità nel calcolo di un singolo digest ma dispendiosità nel calcolo di un numero elevato);

  • capacità di memoria richiesta elevata, tale da saturare la RAM nel calcolo contemporaneo di molti digest.

La cifratura, alternativa, delle password è sconsigliata per la complessità della gestione delle chiavi.

Ulteriori strumenti

Il salt

Benché non aumenti il livello di sicurezza della conservazione delle password, rende il processo di attacco più lento e oneroso, anche in termini computazionali.

Il salt è una stringa di bit casuali che viene concatenata alla password prima del calcolo del digest e poi salvata in chiaro insieme al digest della password dell’utente.

Nel caso in cui si desideri un maggiore livello di sicurezza, il salt può anche essere salvato in un archivio differente da quello contenente le password.

Non ostacola né rallenta la procedura di autenticazione: concatenato alla password inserita dall’utente in fase di primo accesso prima di applicare l’algoritmo di hashing, è salvato in chiaro.

E’ utile perché

  • costringe l’attaccante, nel calcolo del digest, a concatenare il salt corrispondente, valido per il solo utente interessato: il numero di tentativi di applicazione della funzione di hash da effettuare aumenta con l’aumentare della dimensione dell’archivio da espugnare;

  • due utenti con password identica avranno due salt differenti e, quindi, due digest differenti;

  • le rainbow table (v. nota 2) diventano sostanzialmente inutilizzabili.

Per essere efficace dovrebbe:

  1. essere generato casualmente per ogni password;

  2. avere una lunghezza adeguata (per evitare il precalcolo di una particolare rainbow table).

 

Il pepper

Altro strumento crittografico utilizzato per aggiungere livelli di sicurezza.

E’ una stringa di bit casuale che, al contrario del salt, può essere la stessa per tutte le password nell’archivio, ma deve essere tenuta segreta in quanto viene utilizzata come chiave di un HMAC o di un meccanismo di cifratura simmetrico applicato al digest della password.

I principali algoritmi

Le funzioni di derivazione di chiave

Tali funzioni, in sostanza, trasformano una password normale in una versione più sicura, rendendo estremamente difficile per l’attaccante indovinarla o decifrarla.

Queste funzioni creano una o più chiavi segrete a partire da un valore iniziale segreto, come una master key.

Le funzioni di derivazione sono prescelte tenendo conto: i) del costo computazionale (numero di iterazioni di una funzione dell’algoritmo che ne rallenta l’esecuzione); ii) memoria utilizzata (per eseguire l’algoritmo); iii) la possibilità di personalizzazione.

I principali algoritmi

Il documento passa poi in rassegna i principali algoritmi per il password hashing che, qui si riassumono solamente, lasciando ai tecnici e agli esperti il rinvio al documento originale.

  • PBKDF2

  • scrypt

  • bcrypt

  • Argon2

 

Conclusioni

Il documento termina raccomandando l’utilizzo degli algoritmi di cui a questa tabella:

Casi recenti di attacchi andati a buon fine verso database di password non correttamente conservate e, ovviamente, altrettanto recenti casi di esfiltrazioni e richieste di riscatto suggeriscono, stante anche la provenienza del documento, laddove necessario, di adeguare i propri sistemi di conservazione così come, laddove predisposti, realizzati o gestiti per conto di clienti, di fare altrettanto.

Le indicazioni, infatti, devono intendersi quale attuale ricognizione dello “stato dell’arte” e delle conoscenze del settore, con il che il mancato adeguamento potrebbe agevolmente essere imputato quale comportamento colpevole o, comunque, non rispettoso dei principi che prevedono una adeguata predisposizione di misure di sicurezza.

Ciò vale, naturalmente, anche per le organizzazioni che demandano il servizio di conservazione (gestione e manutenzione di siti e applicazioni dove gli utenti – clienti accedono) a fornitori: la richiesta di conferma di applicazione di misure di sicurezza sulla conservazione delle password quali quelle indicate nel documento ben potrà essere oggetto di audit, richieste, verifiche.

 

Note

1 Aspetti importanti della sicurezza delle informazioni sono quelli relativi all’autenticità e al non ripudio: è fondamentale che un soggetto che voglia accedere a una risorsa sia realmente chi dichiara di essere e non possa, inoltre, negare una sua eventuale azione o transazione. I cosiddetti passaggi di 1) identificazione (il soggetto si presenta al sistema con il proprio identificativo); 2) autenticazione (l’identità viene verificata per il tramite di una “cosa” che il soggetto “sa” – password, “possiede” – token o “è” – biometria); 3) autorizzazione (l’utente accede, in base alle politiche prestabilite, alle sole risorse autorizzate); 4) auditing (le azioni e le modifiche vengono tracciate); 5) accounting – accountability (revisione dei file di log per la verifica della compliance e l’eventuale imputazione di violazioni), sono servizi cruciali per garantire sicurezza.

2 Gli attacchi brute force e dictionary sono due metodi usati per decifrare le password.

Nell’attacco brute force, l’aggressore prova tutte le possibili combinazioni di caratteri fino a trovare la password corretta. È come provare a indovinare una combinazione di cassaforte provando ogni possibile sequenza numerica.

L’attacco dictionary, invece, utilizza un elenco di parole comuni o frequentemente usate come password. È simile a cercare una chiave smarrita solo nei posti più ovvi, anziché in ogni angolo possibile. Questo metodo sfrutta il fatto che molte persone scelgono password semplici o basate su parole reali.

In aggiunta, per ridurre lo sforzo computazionale e,quindi, le tempistiche di attacco a discapito della memoria utilizzata, sono spesso utilizzate delle rainbow tables o “tabelle arcobaleno”, tabelle precompilate contenenti i digest di un numero elevato di password comuni. Questi digest possono essere direttamente confrontati con quelli nell’archivio, rendendo, di fatto, l’attacco estremamente rapido.