it-swarm.dev

Qual è la differenza tra una funzione hash e una funzione hash crittografica?

Voglio dire, è solo una questione di "quanto è difficile invertire la funzione con la tecnologia attuale"?

O c'è un concetto matematico o proprietà che li rende diversi?

Se si tratta di "quanto è difficile invertire la funzione", allora è corretto affermare che con l'avanzamento della tecnologia, alcune funzioni crittografiche di hash smettono di essere crittografiche per essere solo funzioni hash? È questo che è successo a MD5?

56
Mr.Eddart

Ogni funzione hash crittografica è una funzione hash. Ma non tutte le funzioni hash sono hash crittografiche.

Una funzione di hash crittografica mira a garantire una serie di proprietà di sicurezza. Soprattutto che è difficile trovare collisioni o pre-immagini e che l'output appare casuale. (Ci sono alcune proprietà in più e "difficile" ha limiti ben definiti in questo contesto, ma non è importante qui.)

Le funzioni hash non crittografiche cercano solo di evitare collisioni per input non dannosi. Alcuni mirano a rilevare cambiamenti accidentali nei dati (CRC), altri cercano di inserire oggetti in diversi bucket in una tabella hash con il minor numero possibile di collisioni.

In cambio di garanzie più deboli sono in genere (molto) più veloci.

Definirei MD5 una funzione hash crittografica, poiché mirava a fornire sicurezza. Ma è rotto, e quindi non è più utilizzabile come hash crittografico. D'altra parte, quando si dispone di una funzione hash non crittografica, non è possibile definirla "non funzionante", dal momento che non ha mai cercato di essere sicuri in primo luogo.

62
CodesInChaos

Ci sono alcune proprietà che le funzioni hash crittograficamente sicure richiedono fortemente, che non sono così fortemente richieste per le funzioni hash non crittograficamente sicure:

  • resistenza preimage (dato un hash h deve essere difficile trovare un messaggio m che restituisca h quando viene hash
  • debole resistenza alle collisioni (con un messaggio m1 deve essere difficile trovare un messaggio diverso m2 così che m1 e m2 produce lo stesso hash)
  • forte resistenza alle collisioni (dovrebbe essere difficile trovare messaggi m1 e m2 che producono lo stesso hash)

In quei punti, vedi molto difficile, che è una misura qualitativa anziché quantitativa. La migliore risposta qui è la fattibilità: c'è una linea sfocata quando qualcosa diventa fattibile e quelle linee si muovono nel tempo (poiché le capacità di calcolo crescono esponenzialmente secondo la Legge di Moore, una volta che i problemi difficili possono ora essere risolti dal tuo cellulare).

In generale è buona norma supporre che difficile significhi che il tempo per raggiungere un obiettivo è NP-completo. Ciò significa che il tempo necessario per interrompere l'hash aumenta man mano che aumenta la lunghezza dell'hash.

Un altro punto è che un algoritmo di hash crittograficamente sicuro può essere utile in alcune applicazioni, ma non in altre. Dipende dal modello del tuo aggressore, dalla natura delle informazioni che vuoi proteggere e da cose come i requisiti di prestazione (come regola generale, migliori sono le proprietà crittografiche di un hash, peggiore è il comportamento in fase di esecuzione).

21
jupp0r

Direi che le due cose chiave da capire qui sono:

  1. Il termine "funzione hash" è vago o, più precisamente, polisemo: ha una "famiglia" di significati strettamente correlati ma distinti. Se qualcuno identifica una funzione come "funzione hash", l'etichetta semplicemente non ti dice quali proprietà deve avere quella funzione. Devi esaminare il contesto in cui viene utilizzato il termine e i requisiti di tale contesto.
  2. Il termine "funzione hash crittografica" è un termine improprio: sembra una descrizione, ma ha una definizione tecnica implicita che il termine stesso non descrive in realtà. Per dirla semplicemente, ci sono funzioni come codici di autenticazione dei messaggi (MAC) che sono spesso etichettati come funzioni hash e offrono una qualche forma di sicurezza crittografica, ma non sono "funzioni hash crittografiche" nel convenzionale definizione.

Il termine "funzione hash crittografica" è convenzionalmente usato per riferirsi a ciò che potrebbe essere meglio etichettato come funzioni hash resistenti alle collisioni , che sono public funzioni ("public" = non richiede una chiave segreta) che devono avere queste tre proprietà:

  • Seconda resistenza preimage: Per un valore casuale m1 Scelto da una parte onesta, è molto costoso per un attaccante trovare qualsiasi valore m2 ≠ m1 Tale che hash(m1) = hash(m2).
  • Resistenza pre-immagine: Per un valore casuale h scelto da una parte onesta, è molto costoso per un attaccante trovare qualsiasi valore m tale che hash(m) = h.
  • Resistenza alla collisione: È molto costoso per un attaccante trovare una coppia di valori m1 ≠ m2 Tale che hash(m1) = hash(m2).

C'è una quarta proprietà che funzioni hash crittografiche meno recenti falliscono banalmente, ma quali più recenti come SHA-3 e Blake2 sono progettate per raggiungere:

  • Indifferentabilità casuale di Oracle: Questo è quasi impossibile da spiegare brevemente, ma riduciamolo a questo: è molto costoso per un attaccante trovare qualsiasi non -cambia le correlazioni tra gli output degli input di loro scelta.

La proprietà casuale di Oracle (se correttamente formulata) implica le tre proprietà precedenti, oltre a quelle aggiuntive come l'assenza di efficienti attacchi di estensione della lunghezza . (Le estensioni di lunghezza sono la ragione più ovvia per cui funzioni hash meno recenti come SHA-256 e SHA-512 non riescono a ottenere la proprietà Oracle casuale.)

3
Luis Casillas