Hai bisogno di entrambi un sale e un IV quando fai ... due azioni distinte, una che richiede un sale e l'altra una IV. Questo è il tuo caso qui.
Salt si riferisce alla conversione di una password in una chiave segreta . Questo è ciò che viene utilizzato nel codice di esempio: PBKDF2 è una funzione di derivazione della chiave basata su password . Come tutto ciò che utilizza le password, PBKDF2 richiede lentezza configurabile (che è il parametro "2000") e anche unicità , che il sale garantisce. Questa è una sottoclasse di hashing delle password, che è spiegato lì .
L'IV è necessario per la crittografia effettiva. La modalità CBC è un algoritmo sequenziale, in cui ogni blocco di dati viene prima sottoposto a XOR con l'output dell'elaborazione del blocco precedente. Deve iniziare da qualche parte ... quindi IV è il "blocco precedente" arbitrario da utilizzare per il primo blocco.
In generale, la modalità CBC richiede un IV che è uniformemente casuale e non può essere previsto da un utente malintenzionato che si trova nella posizione di scegliere parte dei dati che deve essere crittografato (l'attacco BEAST su SSL è di quel tipo). Tuttavia, i problemi sorgono solo quando viene utilizzata la stessa chiave almeno due volte. Pertanto, i due trucchi seguenti potrebbero essere applicabili ed evitare la necessità di trasmettere una IV lungo il file crittografato:
- PBKDF2 può essere utilizzato per generare un output di lunghezza configurabile. È possibile generare con PBKDF2 abbastanza byte per la chiave e IV.
- Viene utilizzata una IV convenzionale, fissa (ad esempio "tutti zeri").
Entrambi i metodi sono validi solo se la chiave di crittografia specifica viene utilizzata una sola volta. Ciò significa che se viene utilizzata la stessa password per crittografare due file, è necessario generare un nuovo sale casuale per ciascun file. Questo implica che se la trasformazione password-chiave è computazionalmente costosa (e dovrebbe essere) e molti file devono essere crittografati con la stessa password, allora il costo totale può diventare proibitivo.
Se lo stesso sale è usato per diversi file (con la stessa password) (*), la conseguenza è che la stessa chiave verrà usata per tutti questi file, il che va bene .. fino a quando ogni file ottiene anche il proprio IV. Quindi l'IV deve essere memorizzato in qualche modo nell'intestazione del file. D'altra parte, se tutti i file utilizzano la stessa quantità di sale, allora forse puoi condividere lo spazio di archiviazione per quel sale?
Il metodo generico, sicuro consiste nell'utilizzare un IV casuale (generato da un PRNG crittograficamente valido) per l'esecuzione della crittografia ogni , indipendentemente da come è stata ottenuta la chiave. Ciò evita di fare ipotesi implicite sul processo di generazione delle chiavi e sulla frequenza con cui si verifica nel protocollo generale. Inoltre, questo consente di mutualizzare la trasformazione password-to-key se molti file devono essere crittografati come un processo batch con la "stessa password": purché ogni file abbia il proprio IV casuale, la stessa chiave (derivata una volta dalla password, con one salt) può essere tranquillamente applicato per tutti. Questo è in qualche modo ciò che accade in TLS (versione 1.1 e altro): tutti i record in un dato la connessione viene crittografata con la stessa chiave, ma ogni record ottiene il proprio IV, e questo è sicuro (in TLS 1.0, ogni record ottiene il proprio IV copiandolo dalla fine del precedente record crittografato, che è vulnerabile a BEAST perché questi IV è quindi prevedibile attraverso l'osservazione; in TLS 1.1+, ogni record ha un nuovo IV casuale specifico).
(*) MAI riutilizzare un valore salt per password distinte. Mai.