Funzione hash Xor

3

Per una funzione hash qual è il miglior metodo sicuro, XOR o Concatena:

h (data1 XOR data2 XOR data3 XOR data4)? o usare h (dati1 || dati2 || dati3 || dati4)?

    
posta 17.01.2013 - 11:39
fonte

3 risposte

6

Dipende davvero da cosa stai cercando di fare; una funzione di hash è uno strumento . Proprio come un martello è buono se vuoi colpire le unghie, non tanto se vuoi nutrire un bambino (un biberon è meglio per quello).

Un uso principale delle funzioni di hash è ottenere un "digest" che rappresenta un dato dato. Questo è il primo passo per firme digitali : invece di firmare un dato, in realtà firmiamo l'hash di il pezzo di dati; l'hash è "buono" come i dati originali a scopo di verifica (dato che non è possibile imbrogliare una funzione hash) ma il valore hash ha una dimensione fissa e breve che è molto più comoda da mappare nelle strutture matematiche utilizzate dall'algoritmo della firma. Un utilizzo simile delle funzioni di hash è per la memorizzazione di "token di verifica" come quello che succede con le password: si memorizza l'hash della password, in modo che quando la password "ritorna", è possibile verificare che corrisponda a ciò che si è memorizzato; ma ciò che memorizzi non è sufficiente per (facilmente) ricalcolare la password.

Apparentemente, vuoi cancellare un insieme di elementi di dati : i dati di input sono un insieme di quattro blocchi di dati.

Se il tuo set è ordinato (consideri "data1, data2, data3, data4" distinto da "data1, data2, data4, data3"), dovresti usare la concatenazione, non lo XOR . Se è per questo, vorresti probabilmente hash una codifica un po 'meno ambigua, perché se data1 è "df" e data2 è "gh", allora la concatenazione produce "dfgh" che è lo stesso valore che si otterrebbe dalla concatenazione di "d" con "fgh". Se i tuoi elementi di dati sono una stringa di caratteri che non include mai una virgola, puoi concatenarli con segni di virgola come separatori, il che è sufficiente per evitare questa ambiguità.

Se il tuo set non è ordinato (tu consideri "data1, data2, data3, data4" per avere lo stesso significato di "data1, data2, data4, data3" e vuoi che sia l'hash sia lo stesso valore), quindi lo XOR non è la soluzione giusta neanche; dovresti invece applicare un "passaggio di ordinamento" in cui i quattro elementi di dati vengono ordinati per la prima volta in modo non ambiguo (ad esempio, l'ordine lessicografico), e quindi fai la concatenazione come sopra.

Non immagino uno scenario in cui XORing possa fare qualcosa di utile qui, ma forse hai un caso d'uso in cui lo XOR capita di fare la cosa giusta. Dipende davvero da cosa vuoi ottenere.

    
risposta data 17.01.2013 - 19:08
fonte
5

Nel tuo esempio, XOR è un modo per rimescolare i dati. Le funzioni di hash forniscono già un buon rimescolamento, quindi concatenare fornirebbe una porzione di dati più lunga per resistere meglio a un attacco di forza bruta.

Se si utilizza XOR e l'utente malintenzionato può controllare il campo data1 , l'utente malintenzionato può controllare l'output dell'operazione XOR e l'hash risultante. Un esempio potrebbe essere XOR - qualcosa controllato dall'attaccante con qualcosa che sta cambiando, come un time stamp. L'attaccante può creare un input per controllare l'output dello XOR, eliminando quindi l'effetto della modifica del timestamp.

    
risposta data 17.01.2013 - 11:44
fonte
3

Concatenazione *: ti darà:

  1. Un hash univoco: se alcune combinazioni di data1-4 producono lo stesso XOR (sì, lo possono fare) avrai una collisione anche prima di applicare l'hash.
  2. Uno spazio chiavi più lungo. Anche se data1-4 non si scontrano mai quando XORed, lo spazio per i tasti di input è più grande e sarà più difficile raggiungerlo con forza bruta.

    • La concatenazione è il "metodo migliore" dei due (vedi il commento di StephenTouset in basso)
risposta data 17.01.2013 - 11:45
fonte

Leggi altre domande sui tag