2011-02-24 29 views
18

Sto usando la libreria mcrypt di PHP e l'algoritmo AES-256 (rijndael), che richiede sia un vettore di chiave + di inizializzazione da eseguire.Crittografia: utilizzo del tasto di inizializzazione vettoriale vs chiave?

Il mio logico cervello non è davvero d'accordo. Non è sufficiente una sola chiave?

scenario teorico:
Se avessi cifrato dati sensibili memorizzati in un database, che solo il proprietario deve essere in grado di decifrare, sarebbe opportuno utilizzare gli utenti hash password per il tasto o l'inizializzazione vettore per i suoi dati?

La chiave deve essere considerata più privata del vettore di inizializzazione o è il contrario?

+2

+1 buona domanda. – rook

risposta

11

No, in effetti un IV è di vitale importanza nella maggior parte delle implementazioni. Anche l'IV è considerato sicuro per l'uso pubblico, ad esempio l'IV viene trasmesso in formato testo per WEP e WPA1/WPA2. Il problema sorge quando questa stessa chiave + iv viene utilizzata per crittografare lo stesso testo normale. I testi cifrati saranno identici, a meno che non si usi un IV. Se un utente malintenzionato può crittografare un testo normale arbitrario con questa chiave, quindi visualizzare il testo della crittografia. Questo è un modo molto più veloce di forzare bruto altro testo di cifratura che l'attaccante ha ottenuto.

Non solo, l'IV deve essere casuale o in violazione dello CWE-329. Il motivo per cui questo è un problema è un po 'più sottile e I didn't get it at first. Non hai menzionato questo, ma spero che tu stia utilizzando lo CBC or CMAC modes

L'uso di una funzione di hash su una password è quasi identico all'utilizzo di una funzione String2Key. Si tratta di un solido design purché un utente malintenzionato non possa utilizzare SQL Injection per ottenere la chiave.

+0

Ciao Rook. Questa era una novità per me. Molte grazie! Dovrei essere al sicuro allora se usassi 'CFC' con una IV non casuale? – Industrial

+0

@Industrial In realtà la sua modalità 'CBC', e la IV ** deve ** essere casuale. In un database puoi avere una colonna per iv e generare questo numero usando 'mt_rand()'. – rook

+0

@Rook Hmm. Non ero in grado di decodificare le mie stringhe crittografate senza avere un IV che sia coerente tra crittografia e decrittografia, quindi non ci sono casualmente. Forse sto facendo qualcosa di sbagliato o stai dicendo che la IV dovrebbe sempre essere completamente randomizzata? – Industrial

6

Inizializzazione Vector (IV) non è affatto una chiave e non è un segreto. In effetti, è spesso esposto (ad esempio anteposto ai dati crittografati). Viene utilizzato come input casuale aggiuntivo per l'algoritmo di crittografia in modo che il risultato della crittografia degli stessi dati chiari sia diverso ogni volta che si utilizza un IV diverso. In questo modo, le statistiche non possono essere raccolte sui dati crittografati. Non "migliora" la forza di crittografia da solo.

È possibile cercare here per i diagrammi che mostrano come e perché viene utilizzato IV.

+0

È grandioso. Grazie! – Industrial

7

Non utilizzare la password con hash come origine singola per chiave e IV. Come regola generale, dovresti generare in modo casuale IV OGNI VOLTA che aggiorni i dati crittografati e memorizzi IV con questi dati. La chiave può essere riutilizzata più volte, ma usa l'hash salato e salva anche i dati.

Se si utilizzano solo password utente e le si utilizza come chiavi di crittografia, gli utenti con le stesse password avranno le stesse chiavi. A seconda della struttura del database e dei diritti di accesso agli intrusi, potrebbero verificarsi casi sfortunati in cui è possibile rilevare utenti con password identiche. Aggiungi almeno un nome utente univoco a questo hash.

Se non si modifica IV per ogni aggiornamento di dati, è possibile che le informazioni relative alle modifiche dei dati vengano perse. Con la modalità CBC o CFB, i primi blocchi di testo in chiaro identici verranno crittografati in un testo cifrato identico fino alla prima modifica del testo in chiaro, quindi è possibile determinare la posizione di questo cambiamento.

+0

consiglio molto importante – davka

+0

Grazie mille per il consiglio! – Industrial

+0

Quindi, invece di un campo nel DB, ora ne servono almeno 3? Valore crittografato, IV e sale? Possiamo anche aggiungere la chiave che renderebbe 4 campi nel DB (ma non salverei la chiave nel DB). Sembra un sacco di lavoro, forse non necessario? – Piero

0

Se si utilizza la modalità EBP del codice a blocchi o la maggior parte dei codici di flusso, le combinazioni di chiavi e IV identiche su diversi testi in chiaro offriranno agli aggressori una vista diretta sul risultato XOR della chiave.Questo per estensione rivela la chiave stessa e in una certa misura la password.

Ma voglio dire che le IV sono sicuramente necessarie? No. Finché cambi la tua password ogni volta sul tuo prossimo blocco di testo normale (anche lo stesso blocco la seconda volta), stai completamente bene senza IV. In realtà, tutto ciò che fa un IV è l'automazione del processo di cui sopra.

+0

Cos'è la modalità EBP? Mai sentito parlare di quello e una rapida ricerca non rivela nulla. La modalità OFB e CTR perdono il keytream poiché sono efficacemente codificati in streaming. Ma nessuna modalità popolare perde la chiave stessa. – CodesInChaos

Problemi correlati