Sto utilizzando Rfc2898DeriveBytes
per generare in modo sicuro la chiave di crittografia e il vettore di inizializzazione dalla password di stringa fornita dall'utente, da utilizzare con la crittografia simmetrica (ad esempio AesManaged).È corretto utilizzare hash SHA1 di password come salt quando si derivano la chiave di crittografia e IV dalla stringa della password?
Sto prendendo l'hash SHA1 della password come parametro salt su Rfc2898DeriveBytes
. È ok? Se no, allora da dove dovrei prendere il sale? Avrò bisogno dello stesso sale quando decifro, giusto? Quindi devo conservarlo da qualche parte in chiaro - non protetto. Se devo conservarlo in modo sicuro, diventa semplicemente un'altra "password", vero?
void SecureDeriveKeyAndIvFromPassword(string password, int iterations,
int keySize, int ivSize, out byte[] key, out byte[] iv)
{
// Generate the salt from password:
byte[] salt = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(password));
// Derive key and IV bytes from password:
Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, salt, iterations);
key = derivedBytes.GetBytes(keySize);
iv = derivedBytes.GetBytes(ivSize);
}
Ho visto usare il costante (hardcoded) sale e ho visto persone lamentarsi. Pensavo che ricavare il sale dalla password sarebbe stata l'idea migliore, ma non sono sicuro che questa sia una soluzione ottimale.
In breve, ho un file che deve essere crittografato e la stringa di password immessa dall'utente. Come uso correttamente Rfc2898DeriveBytes
per derivare la chiave di crittografia sicura e IV?
Grazie.
EDIT:
Grazie per le vostre risposte. Ora capisco che lo scopo principale (forse solo?) Di Salt è rendere impossibile la generazione di tabelle arcobaleno - non è possibile pre-generare l'hash di "P @ $$ w0rd" perché avrà un hash diverso per ogni possibile valore salato. Lo capisco perfettamente, MA ... È davvero rilevante per la crittografia simmetrica? Non sto memorizzando l'hash ovunque, giusto? Quindi, anche se l'attaccante ha la tabella arcobaleno per tutte le possibili combinazioni di password, non può fare molto, giusto?
Quindi, la mia domanda ora è: C'è qualche vantaggio di usare il sale a caso in ogni operazione di cifratura, rispetto all'utilizzo di una password di derivazione (o hard-coded anche) sale, se utilizzato con algoritmi di crittografia simmetrica (come AesManaged of .NET)?
È meglio memorizzare solo il valore hash di una password. A differenza di una password crittografata, il valore hash non può essere annullato, anche se l'utente malintenzionato controlla il codice e conosce la chiave. Quindi, perché crittografare la password (PBKDF2 non è crittografia, è hashing)? – martinstoeckli
@martinstoeckli, non sto crittografando la password, né sto memorizzando il suo hash ovunque. Ho appena derivato la chiave di crittografia (e iv) dalla password della stringa e poi criptato il payload con esso. –
Penso di aver capito ora. Si desidera calcolare prima l'hash dalla password e quindi utilizzare questo valore hash per crittografare alcuni dati (anziché utilizzare direttamente la password originale). – martinstoeckli