Due modi per generare IV

5

Sto guardando un codice, e in uno scenario particolare, il codice dovrebbe generare due IV.

Il secondo codice di generazione IV utilizza semplicemente C # Rijndael GenerateIV ()

Il primo codice di generazione IV prende però parte dell'indirizzo MAC e parte del tempo corrente e inserisce pezzi di questi dati in un array di 16 byte.

In entrambi i pezzi di codice, quindi, l'IV generato viene quindi elaborato una quantità X costante di volte ottenendo l'hash della IV e quindi guardando alcuni byte casuali e re-hashing.

Domande :

  • Vedi qualche vantaggio nell'avere due modi per generare la IV?
  • Il post-IV genera hashing necessario o eccessivo? - ed è così qualcosa di standardizzato o un'idea oscura?
  • Potrebbero esserci scenari o configurazioni in cui la funzione GenerateIV non fornisce dati casuali?

Note:

  • Questi IV devono essere utilizzati nella crittografia
  • CipherMode è CBC
posta Zuiq Pazu 17.10.2015 - 11:42
fonte

2 risposte

3

Il modo giusto per generare un IV per la modalità CBC è con un generatore casuale protetto crittograficamente. Ci sono casi in cui una IV non casuale è ok, ma se non hai analizzato attentamente il tuo sistema per essere sicuro di cadere in questi casi, dovresti andare con un IV casuale. Ci sono pochissime situazioni in cui l'utilizzo di un IV non casuale avrebbe comunque alcun vantaggio, quindi vai con un IV casuale.

Non ho familiarità con l'API C #, ma dato che documentazione di GenerateIV afferma che" genera un vettore di inizializzazione casuale (IV) da utilizzare per l'algoritmo ", sembra essere un modo valido per generare un IV per CBC (ma CreateEncryptor fa già lo stesso lavoro).

Prendere l'hash di questi byte casuali è strettamente un rischio, perché riduce l'entropia della IV: gli hash crittografici non sono noti per essere suriettivi. (Immagino tu intenda un hash crittografico come SHA-256, un hash non crittografico sarebbe sicuramente problematico.) Tuttavia, non penso che ci sia alcun problema concreto: in pratica, penso che sia innocuo.

Aggiungere ancora alcuni byte casuali e ripetere l'hashing ripetutamente dovrebbe essere ugualmente sicuro. Tuttavia, è la complessità inutile. La complessità inutile dovrebbe sollevare campanelli d'allarme in qualsiasi contesto di sicurezza. Ciò aumenta il rischio di un bug di implementazione, come la perdita di dati riservati (non è una grande preoccupazione qui, dato che l'IV non ha bisogno di essere riservato, ma sarebbe una considerazione definitiva se si stesse generando una chiave), sovrascrivendo i dati a causa di un overflow del buffer o di un calcolo errato del puntatore, ottenendo il conteggio iterativo a 0 quando è necessaria almeno un'iterazione, ecc.

Il secondo metodo che proponi non è sicuramente sicuro senza il passaggio hashing-a-random in più. Gli indirizzi MAC e il tempo sono prevedibili e CBC richiede una IV imprevedibile . Gli attacchi contro CBC con una IV prevedibile non si applicano a tutti i sistemi (si basano sull'avversario che è in grado di inviare messaggi per la crittografia), ma perché correre un rischio? Inoltre, gli indirizzi MAC e il tempo non sono necessariamente unici: pensa a macchine virtuali clonate, programmi multithread, processi veloci che servono due client nello stesso tick del clock, ecc.

Con la fase aggiuntiva di hashing-a-random, a partire dall'indirizzo MAC e il tempo dovrebbe essere indistinguibile da casuale, a condizione che vengano iniettati abbastanza dati casuali. Ma siamo tornati al problema della complessità: quanto sei sicuro di aver capito bene?

Se il motivo di questa complessità extra è "renderlo più casuale" ... random non funziona in questo modo. Non puoi rendere casuali più casuali semplicemente scherzando, c'è il serio rischio che tu possa rovinare tutto e renderlo meno casuale.

Fare qualcosa di diverso dal prendere una IV casuale (ad esempio con GenerateIV ) aumenta i costi di manutenzione (a partire dal momento in cui stai spendendo ora a preoccuparti), riduce le prestazioni e aumenta i rischi. Quindi usa solo un IV casuale.

Se la distribuzione di una versione aggiornata del codice è costosa, questo non è un problema critico. (Se l'IV era solo il tempo MAC +, potrebbe essere o meno critico a seconda del sistema generale.) Ma dovrebbe essere corretto nel codice di base e implementato con il successivo rilascio normale.

    
risposta data 17.10.2015 - 21:46
fonte
3

Un generatore di numeri pseudo-casuali sicuro (CSPRNG) è sicuro come quello che otterrai. Entrambi i riferimenti a cui punti sono CSPRNG quindi entrambi dovrebbero essere sufficienti per un IV. L'hash non rende casuali più casuali. Utilizzare due meccanismi diversi non ha senso e raddoppia le possibilità di commettere un errore.

Nel caso di GenerateIV , le cose sono già casuali quindi l'hashing successivo e l'aggiunta di più dati casuali non aiuta.

L'uso dell'indirizzo MAC e il tempo per creare l'array iniziale sembrano piuttosto inutili in quanto entrambi sono tutt'altro che segreti. Se l'indirizzo MAC del computer è noto a un utente malintenzionato e l'ora, è possibile indovinare rapidamente l'ora esatta. Quindi tutta la casualità di questa creazione IV proviene dai byte casuali aggiunti alla fine. Forse è sufficiente, non posso dirlo senza vedere il codice reale.

Tieni presente che, secondo il principio di Kercckhoff , non si ottiene alcun vantaggio aggiuntivo utilizzando un algoritmo segreto.

Il mio consiglio è di usare semplicemente i dati di GenerateIV come IV e di farlo in tutti i casi.

    
risposta data 17.10.2015 - 19:25
fonte

Leggi altre domande sui tag