Chiarimento su IV in PBKDF2 per generare la chiave di crittografia

2

Mi sono reso conto che la seguente implementazione non è veramente sicura:

$pb = pbkdf2('sha256', $_POST['pass'], "enc_salt", 100, 100);
$d = openssl_decrypt ($data['container'],'aes-192-cbc', $pb, true, $data['iv']);

In effetti, dovrei usare un unico salt per $ pb invece di "enc_salt", non dovrei?

Inoltre, posso semplicemente utilizzare lo stesso IV per PBKDF: generare la chiave e crittografare effettivamente il contenuto?

    
posta Surfer on the fall 15.07.2015 - 12:38
fonte

2 risposte

2

Il sale è qui per prevenire la condivisione dei costi da parte degli aggressori. Se due password sono state sottoposte a hash con la stessa quantità di sale, un utente malintenzionato potrebbe eseguire l'hashing di una password potenziale utilizzando tale valore salt e confrontare l'output con le versioni hash delle due password; in altre parole, l'attaccante può attaccare le due password hash per il costo di attaccarne una. Questo si riduce: se ci sono 1000 password hash, tutte con lo stesso sale, l'attaccante ne ottiene 999 "gratuitamente".

Questo tipo di condivisione dei costi può assumere diverse forme, una delle quali è una tabella precalcolata (e uno specifico tipo di tabella è chiamato "tabella arcobaleno"). In generale, la condivisione dei costi è un'istanza di parallelismo (con l'appropriato distorsione spazio-temporale).

Dovresti sforzarti di riutilizzare i valori salati il più raramente possibile; se possibile, mai. Nel tuo caso, memorizzerai il sale insieme al file crittografato; e ogni file avrebbe il suo valore di sale (anche se due file usano la stessa password, ognuno dovrebbe avere il proprio sale).

Se ogni file ha il suo valore di sale, allora puoi fare una delle seguenti azioni per il IV:

  • Seleziona un IV casuale e aggiungilo all'intestazione del file (insieme al sale).
  • Usa PBKDF2 per generare la chiave e la IV in un colpo solo (ad esempio, chiedi 256 bit di output, 128 per la chiave e 128 per la IV).
  • Utilizza un IV fisso.

La seconda e la terza opzione sono sicure solo se stai generando un nuovo salt per ogni file, in uno spazio abbastanza grande che le collisioni non si verificano nella pratica. Altrimenti, potresti finire con il riutilizzo IV, che è un peccato. In particolare, ciò che è realmente Bad TM sta utilizzando il doppio IV con lo stesso tasto . Se ogni file ha una propria chiave (poiché la chiave proviene dall'elaborazione della password con il sale e ogni file ha il proprio sale), allora un IV fisso va bene.

Ad ogni modo, se hai bisogno di crittografia, è probabile che sia necessaria anche l'integrità controllata, che richiede un MAC . Assemblare correttamente la crittografia e un MAC è difficile . Il modo corretto è utilizzare una modalità di crittografia che già fa il lavoro in un modo che renda felici i crittografi. In pratica, usa 'aes-192-gcm' , non 'aes-192-cbc' (o 'aes-128-gcm' : 128 bit sono già abbastanza buoni, e sarà leggermente più veloce).

Si noti che la lunghezza IV effettiva per GCM è di 12 byte.

    
risposta data 15.07.2015 - 20:06
fonte
0

Lo scopo principale del sale è di proteggere dagli attacchi dei tavoli arcobaleno. Esistono diversi scenari:

  1. Se non usi sali, un utente malintenzionato potrebbe già avere un tavolo arcobaleno pronto ad iniziare ad attaccare le tue password.
  2. Se utilizzi lo stesso sale per ogni voce, l'utente malintenzionato dovrebbe generare una nuova tabella arcobaleno basata sul tuo sale, che potrebbe quindi utilizzare per attaccare le tue password.
  3. Se utilizzi diversi sali per ciascuna password, un utente malintenzionato dovrebbe generare una tabella arcobaleno separata per ogni password che desidera crack, il che non è fattibile.

Pertanto si consiglia di utilizzare sempre un sale diverso per ogni password.

Di solito, il sale non è considerato una risorsa segreta e può quindi essere salvato in forma non criptata nel database. L'unico scopo è rendere l'uso di Rainbow Tables non fattibile. Non sono un esperto di IV, ma per quanto ne so, gli IV dovrebbero essere segreti, e probabilmente non è una buona idea se gli IV siano archiviati nel database in forma non criptata. Pertanto, non consiglierei di usare l'IV come sale.

    
risposta data 15.07.2015 - 19:40
fonte

Leggi altre domande sui tag