Passa al contenuto principale

4.1 Salt

4.1 Salt

Un salt nella crittografia basata su password ha tradizionalmente servito lo scopo di produrre un grande insieme di chiavi corrispondenti a una data password, una delle quali viene selezionata casualmente in base al salt. Una chiave individuale nell'insieme viene selezionata applicando una funzione di derivazione delle chiavi KDF, come:

DK = KDF (P, S)

dove DK è la chiave derivata, P è la password e S è il salt. Questo presenta due vantaggi:

  1. È difficile per un avversario precalcolare tutte le chiavi, o anche le chiavi più probabili, corrispondenti a un dizionario di password. Se il salt è lungo 64 bit, ad esempio, ci saranno fino a 2^64 chiavi per ogni password. Un avversario è quindi limitato a cercare le password dopo che un'operazione basata su password è stata eseguita e il salt è noto.

  2. È improbabile che la stessa chiave venga selezionata due volte. Ancora, se il salt è lungo 64 bit, la probabilità di "collisione" tra le chiavi non diventa significativa fino a quando non sono state prodotte circa 2^32 chiavi, secondo il Paradosso del Compleanno. Il fatto che le collisioni siano improbabili affronta alcune preoccupazioni sulle interazioni tra usi multipli della stessa chiave che possono sorgere quando si utilizzano alcune tecniche di cifratura e autenticazione.

Nella cifratura basata su password, la parte che cifra un messaggio può ottenere la garanzia che questi vantaggi siano realizzati semplicemente selezionando un salt grande e sufficientemente casuale quando deriva una chiave di cifratura da una password. Una parte che genera un codice di autenticazione del messaggio può ottenere tale garanzia in modo simile.

La parte che decifra un messaggio o verifica un codice di autenticazione del messaggio, tuttavia, non può essere sicura che un salt fornito da un'altra parte sia stato effettivamente generato casualmente. È possibile, ad esempio, che il salt possa essere stato copiato da un'altra operazione basata su password nel tentativo di sfruttare le interazioni tra usi multipli della stessa chiave. Ad esempio, supponiamo che due parti legittime scambino un messaggio cifrato, dove la chiave di cifratura è una chiave a 80 bit derivata da una password condivisa con qualche salt. Un avversario potrebbe prendere il salt da quella cifratura e fornirlo a una delle parti come se fosse per una chiave a 40 bit. Se la parte rivela il risultato della decifratura con la chiave a 40 bit, l'avversario potrebbe essere in grado di risolvere per la chiave a 40 bit. Nel caso in cui la chiave a 40 bit sia la prima metà della chiave a 80 bit, l'avversario può quindi risolvere facilmente per i restanti 40 bit della chiave a 80 bit.

Per difendersi da tali attacchi, o l'interazione tra usi multipli della stessa chiave dovrebbe essere attentamente analizzata, o il salt dovrebbe contenere dati che distinguano esplicitamente tra diverse operazioni. Ad esempio, il salt potrebbe avere un ottetto aggiuntivo, non casuale, che specifica se la chiave derivata è per la cifratura, per l'autenticazione del messaggio o per qualche altra operazione.

Sulla base di ciò, si raccomanda quanto segue per la selezione del salt:

  1. Se non c'è preoccupazione per le interazioni tra usi multipli della stessa chiave (o un prefisso di quella chiave) con le tecniche di cifratura e autenticazione basate su password supportate per una data password, allora il salt può essere generato casualmente e non è necessario che sia controllato per un formato particolare dalla parte che riceve il salt. Dovrebbe essere lungo almeno otto ottetti (64 bit).

  2. Altrimenti, il salt dovrebbe contenere dati che distinguano esplicitamente tra diverse operazioni e diverse lunghezze delle chiavi, oltre a una parte casuale che sia lunga almeno otto ottetti, e questi dati dovrebbero essere controllati o rigenerati dalla parte che riceve il salt. Ad esempio, il salt potrebbe avere un ottetto aggiuntivo non casuale che specifica lo scopo della chiave derivata. In alternativa, potrebbe essere la codifica di una struttura che specifica informazioni dettagliate sulla chiave derivata, come la tecnica di cifratura o autenticazione e un numero di sequenza tra le diverse chiavi derivate dalla password. Il formato particolare dei dati aggiuntivi è lasciato all'applicazione.

Nota: Se un generatore di numeri casuali o un generatore pseudocasuale non è disponibile, un'alternativa deterministica per generare il salt (o la parte casuale di esso) è applicare una funzione di derivazione delle chiavi basata su password alla password e al messaggio M da elaborare. Ad esempio, il salt potrebbe essere calcolato con una funzione di derivazione delle chiavi come S = KDF (P, M). Questo approccio non è raccomandato se il messaggio M è noto per appartenere a uno spazio di messaggi piccolo (ad esempio, "Sì" o "No"), tuttavia, poiché in tal caso ci sarà solo un piccolo numero di salt possibili.