Sta usando la concatenazione di più algoritmi hash più sicuri?

24

Nella pratica è più sicuro utilizzare l'output di più algoritmi hash invece di uno solo (assumendo che le dimensioni dell'output siano le stesse)?

Con sicurezza, in questo contesto, intendo la protezione da entrambe le collisioni e la reversibilità delle funzioni.

Un esempio particolare sarebbe utilizzare 128 bit da SHA-512 più 128 bit da MD5 invece di usare 256 bit da SHA-512.

La mia intuizione è che, teoricamente, questo indebolirebbe la funzione, perché ci sono noti attacchi contro MD5 che, in pratica, ridurrebbe la dimensione dell'output della funzione combinata. Tuttavia, in pratica, è più difficile trovare una collisione / inversione per entrambi gli algoritmi allo stesso tempo - perché implicherà un ulteriore lavoro teorico invece di usare esistente (o imminente) quelli pubblicati ?

Modifica

Per chiarire, sto semplicemente chiedendo le proprietà di base dell'irreversibilità e della resistenza alle collisioni - non su un particolare uso delle funzioni di hash, come la derivazione delle chiavi dalle password (c'è un'eccellente copertura a riguardo in altre domande) o usando l'output come identificatori univoci.

Un altro modo per esprimere questo sarebbe "è una funzione di hash definita come la concatenazione di altre due funzioni di hash meglio di quelle?". Inoltre, sono (in qualche modo) consapevole che, informazione teoricamente , non può essere.

    
posta goncalopp 16.03.2015 - 13:23
fonte

3 risposte

18

Dal punto di vista della resistenza alla collisione (trovando due messaggi in collisione) e della seconda resistenza preimage (trovando un messaggio diverso in conflitto con un dato), la concatenazione di più hash è sicura almeno quanto il più strong degli hash (Prova: per ognuna delle due proprietà, qualsiasi attacco che interrompe la concatenazione può essere trasformato in un attacco che interrompe ogni hash. Ad esempio, i collisioni ipotetiche dei messaggi per l'MD5 640 || SHA-512 si scontrano anche per SHA-512 , quindi se SHA-512 è resistente alla collisione, quindi MD5 || SHA-512 è resistente alle collisioni).

Dal punto di vista di trovare un messaggio che esegue un hashing su un dato valore ([prima-] preimage resistance), o trovare un messaggio sconosciuto (possibilmente a breve o bassa entropia) noto all'hash su un dato valore (la situazione in hashing della password ), è prudente considerare che la concatenazione di più hash è insicura (probabilmente molto peggio di qualsiasi hash). Possiamo costruire hash in modo che ognuno sia individualmente resistente alla ricerca di un messaggio sconosciuto (scelto casualmente in un set troppo grande per esplorare) dal suo hash, ma la concatenazione è totalmente debole contro quello.

Per molti hash iterati inclusi tutti gli hash Merkle-Damgård (quindi MD5, SHA-1, i vari SHA-2), usando il concetto di multicollisioni, si può dimostrare che la concatenazione di più hash non è molto più sicura contro collisioni rispetto al più strong degli hash. Vedi Antoine Joux: Multicollisioni nelle funzioni hash iterate. Applicazione alle costruzioni in cascata , in corso di Crypto 2004.

L'articolo sopra suggerisce strongmente che tra usando 128 bit da SHA-512 più 128 bit da MD5 (o) usando 256 bit da SHA-512 , la successiva è molto più sicuro L'unica certezza che abbiamo riguardo al primo è che non è peggio di SHA-512 troncato a 128 bit, che può essere attaccato in circa 2 64 hash, quando ci aspettiamo che il secondo richieda circa 2 < sup> 128 hash per attaccare.

    
risposta data 17.03.2015 - 14:34
fonte
26

Non parli di cosa stai usando gli hash, ma sembra probabile che il tuo intento sia da utilizzare se per la verifica della password.

Quindi, il primo problema da chiarire è la preoccupazione che un determinato algoritmo potrebbe essere ritenuto suscettibile alle collisioni. Le collisioni non rappresentano una minaccia per gli hash delle password e anche se un algoritmo fosse suscettibile alle collisioni, ciò non lo indebolisce ai fini dell'hash della password. Per l'hashing delle password, siamo invece preoccupati per gli attacchi pre-immagine ... Essere in grado di trovare l'input che è stato utilizzato per creare un determinato hash.

Oggi, il meccanismo principale per attaccare gli hash delle password è un attacco di forza bruta basato sul dizionario. Hai il maggior numero di possibili input che puoi, il più velocemente possibile, per determinare quale input risulta nell'hash che stai cercando di abbinare. Pertanto, la caratteristica più desiderabile della funzione di hashing della password è la lentezza. Volete assicurarvi che ci vuole il tempo più lungo possibile per un utente malintenzionato per verificare gli input richiesti per trovare quello corretto.

Quindi, ora che capiamo cosa stiamo cercando, diamo un'occhiata alla tua proposta.

Se hai cancellato la password due volte, con SHA-512 e MD-5, e troncati a 128 bit di ciascuno, e concatenali insieme, a tutti gli effetti, stai dando all'aggressore due hash con cui lavorare. In molti casi, la sicurezza di un hash non viene ridotta terribilmente dal troncamento, a condizione che la lunghezza risultante sia ragionevole, che probabilmente è 128 bit.

Questo significa che stai prendendo due veloci funzioni hash (SHA-512 e MD-5 sono entrambi troppo veloci per essere efficaci algoritmi di hash delle password) e offri l'hacker l'opportunità di scegliere quale usare per rompere il tuo hash. In questo caso, sceglieranno sicuramente MD-5 e immetteranno input in esso, truncano l'hash a 128 bit e lo abbinano alla porzione MD-5 del tuo hash, e non appena avranno la corrispondenza, è vicino 100% di certezza che hanno anche il valore di cui hanno bisogno per calcolare la porzione SHA-512 dell'hash con una singola prova.

Quindi, non solo questa costruzione specifica non migliora la sicurezza, ma anzi, in effetti, la riduce in modo significativo. Mentre ci sono altre possibili costruzioni che potrebbero aumentare la sicurezza, non è semplice ragionare correttamente, quindi se vuoi davvero una ragionevole sicurezza, usa una costruzione collaudata come bcrypt con un ragionevole fattore di lavoro.

    
risposta data 16.03.2015 - 14:19
fonte
12

In riferimento ai primi paragrafi di questo articolo: link

Se stai pensando di scrivere il tuo codice di hashing della password, non farlo!

Capisco che non si consideri di scrivere il proprio codice di hashing, ma piuttosto di utilizzare più di quelli standardizzati per aumentare in modo considerevole la sicurezza. Questo, tuttavia, non ti darà alcun vantaggio o poco.

Ratchet Freak ( link ) indica che la tua funzione di hash sarebbe sicura solo quanto la tua funzione più debole nella catena. È anche noto che gli algoritmi più deboli si scontrano più spesso e potenzialmente aumentano il rischio di collisioni, riducendo così la sicurezza complessiva.

Inoltre, questo accadrà come diminuito entropia invece di aumentarlo.

Non c'è anche alcun motivo per cui preferiresti andare avanti e implementare due metodi diversi e combinarli - in pratica non ci sarà alcuno o un guadagno molto piccolo. 256 bit SHA-512 sarà più strong di due unisci 128 bit hash - poiché l'entropia è aumentata e nel complesso più strong. MD5 conterrà un'entropia inferiore e quindi diminuirà la sicurezza.

Modifica

Per chiarire la risposta:

SHA-512 è più strong di MD5 (per il numero di bit menzionato, 256 e 128) per il caso menzionato. MD5 ha maggiori probabilità di provocare collisioni. ( link )

128 bit MD5 and 128 bit SHA512 vill only be as collision-resistant as the weaker of the two - the 128 bit MD5. (https://stackoverflow.com/questions/7407835/512-bit-hash-vs-4-128bit-hash)

EDIT

As pointed out by fgrieu down in the comments, this turns out to be not true.

As an illustration, we can find new MD5 collisions at high rate, but there is no known collision for SHA512 truncated to 128 bits, thus no known collision for the 256-bit concatenation of MD5 and SHA512 truncated to 128 bits. -fgrieu

L'unico modo in cui ho potuto vedere che questo è utile è la protezione contro Rainbow Tables, che probabilmente non sarebbe stata preparata per la tua concentrazione di hash. Invece di concentrare gli hash, dovrebbero essere usati i sali. Ma dal momento che non ti interessava il lato della sicurezza delle password ( "Non ho alcun particolare intento, e speravo di considerarlo semplicemente come un'altra funzione di hash" )

Punti riportati nei commenti.

  • Per ridurre le collisioni, la concatenazione è migliore (perché hai bisogno di collisioni su entrambi gli hash contemporaneamente). Per ridurre gli attacchi di pre-immagine, il concatenamento è migliore (perché è necessario invertire entrambi gli hash in sequenza). - Ben Voigt
risposta data 16.03.2015 - 13:56
fonte

Leggi altre domande sui tag