Il IV + Salt può essere lo stesso?

7

Durante la mia app di crittografia ho il bit di creazione della password:

PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 10000, keyLength);

e in seguito sulla parte di crittografia effettiva:

cipher.init(Cipher.ENCRYPT_MODE, secret, ivSpec);

Il vettore di inizializzazione richiede byte casuali, il sale necessita di byte casuali, posso usare gli stessi byte casuali (crittograficamente sicuri) per il sale e l'IV o che in qualche modo indebolirebbe la crittografia? - Potrei rendere l'archiviazione un po 'più semplice se potessi.

Non sto parlando di riutilizzare l'IV o il sale su più messaggi, per ogni messaggio separato verrà generata una nuova matrice di byte, ma potrei io per ogni singolo messaggio raddoppiare e usare gli stessi byte appena generati per entrambi il sale + IV?

EG:

Messaggio 1: byte casuali = h6ds .... Salt = h6ds / IV = h6ds

Messaggio 2: casuale bytes = djs9 .... Salt = djs9 / IV = djs9

Messaggio 3: byte casuali = 9sdf .... Salt = 9sdf / IV = 9sdf

... e così via

    
posta Crizly 27.10.2014 - 22:32
fonte

2 risposte

10

L'IV dovrebbe essere univoco per ogni messaggio crittografato, quindi no, se intendi criptare più di un segreto usando la chiave che generi da questa password, non puoi riutilizzare il sale come IV. Riutilizzare un IV nel migliore dei casi perde informazioni sul testo in chiaro e, nel peggiore dei casi, può distruggere del tutto lo schema di crittografia (a seconda della modalità in uso) e quindi sì, in ogni caso se viene riutilizzato, indebolirà effettivamente la crittografia.

Se, comunque, non lo riutilizzi, e sarà usato solo una volta, allora no, il fatto che lo stesso valore casuale serva da sale altrove non dovrebbe avere alcun effetto su la forza della crittografia a tutti.

Modificato per aggiungere: c'è un avvertimento che non credo si applichi in questo caso specifico, ma dovrebbe menzionarlo. Dato che stai utilizzando un KDF per generare la chiave, il sale costituisce una parte della forza della chiave. Se l'IV viene esposto all'attaccante (data la formulazione della domanda, non credo che sia il caso qui), allora rendi il lavoro dell'aggressore considerevolmente più semplice quando si tratta di essere in grado di calcolare le chiavi candidate e le chiavi generate da le password deboli diventano suscettibili agli attacchi del dizionario. Se il sale / IV viene semplicemente memorizzato, tuttavia, e il compromesso di uno può essere ragionevolmente considerato come un compromesso per entrambi, allora la premessa iniziale che la forza non viene effettuata rimane valida.

    
risposta data 27.10.2014 - 22:55
fonte
2

L'utilizzo di sale per PBKDF2 come IV per un'esecuzione di crittografia che utilizza la chiave ottenuta da PBKDF2 si basa su PBKDF2 che funziona come un oracolo casuale, quindi "isolando" i due usi l'uno dall'altro, impedendo che si verifichino interazioni errate. Questa non è una proprietà molto studiata, ma è plausibile, dato che PBKDF2 è un sacco di chiamate annidate a HMAC e HMAC è il solito candidato per un oracolo casuale.

Tuttavia, un altro design è più semplice da analizzare: è sufficiente che il KDF produca abbastanza byte per la chiave e IV. Ad esempio, da sale e password, generare 32 byte: 16 byte per la chiave di crittografia e 16 altri byte per IV. In questo modo, si mantiene la fattura di archiviazione allo stesso livello (solo un sale, nessuno spazio aggiuntivo per la IV) e diventa in qualche modo evidente che non si sta facendo affari funky con il tuo IV. Come bonus aggiuntivo, se passi KDF a un altro con severi requisiti sul valore e sulla dimensione del sale, puoi comunque ottenere un IV di lunghezza appropriata per la tua crittografia.

Si applicano avvertenze usuali:

  • PBKDF2 non è una buona funzione di derivazione della chiave basata su password. In particolare, il tempo di esecuzione aumenta proporzionalmente alla dimensione dell'output (con soglie), il che significa che ottenere più di 20 byte da PBKDF2 potrebbe costringerti a dimezzare il numero di iterazioni, il che è dannoso per la sicurezza. Inoltre, PBKDF2 è facile da ottimizzare su una GPU. Bcrypt sarebbe una scelta migliore ; per la parte "lunghezza dell'output arbitrario", accoppiare la funzione di hashing della password con un buon KDF (veloce) come HKDF .

  • Quando esegui la crittografia, probabilmente hai bisogno anche di un MAC . Questo può essere un lavoro complicato.

risposta data 28.10.2014 - 00:22
fonte

Leggi altre domande sui tag