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

49

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

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

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

    
posta edutesoy 17.02.2012 - 10:20
fonte

3 risposte

56

Ogni funzione di hash crittografica è una funzione di hash. Ma non tutte le funzioni di hash sono un hash crittografico.

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

Le funzioni hash non crittografiche cercano solo di evitare le collisioni per input non dannosi. Alcuni mirano a rilevare modifiche accidentali nei dati (CRC), altri cercano di mettere oggetti in diversi contenitori in una tabella hash con il minor numero di collisioni possibili.

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

Chiamerei comunque MD5 una funzione hash crittografica, poiché mirava a fornire sicurezza. Ma è rotto, e quindi non più utilizzabile come un hash crittografico. D'altra parte quando si ha una funzione hash non crittografica, non si può realmente chiamarla "interrotta", dal momento che non ha mai cercato di essere al sicuro in primo luogo.

    
risposta data 17.02.2012 - 11:01
fonte
21

Ci sono alcune proprietà che crittografano le funzioni di hash richiedono strongmente, che non sono così strongmente richiesti per funzioni hash non crittograficamente sicure:

  • resistenza preimage (dato un hash h deve essere difficile trovare un messaggio m che produce h quando hash
  • resistenza di collisione debole (dato un messaggio m1 deve essere difficile trovare un messaggio diverso m2 in modo che m1 e m2 generino lo stesso hash)
  • strong resistenza alle collisioni (dovrebbe essere difficile trovare tutti i messaggi m1 e m2 che producono lo stesso hash)

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

In generale, è una buona pratica presumere che difficile significhi che il tempo per raggiungere un obiettivo è NP-completo. Ciò significa che il tempo richiesto per spezzare l'hash aumenta notevolmente man mano che aumenti la lunghezza dell'hash.

Un altro punto è che un algoritmo di hashing 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 cose come i requisiti di prestazione (come regola generale, migliori sono le proprietà crittografiche di un hash, peggiore è il comportamento di runtime).

    
risposta data 17.02.2012 - 09:53
fonte
2

Direi che le due cose chiave da capire qui sono:

  1. Il termine "funzione di hash" è vago - o più precisamente, polisemico : ha una "famiglia" di significati strettamente correlati ma distinti. Se qualcuno etichetta 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 impreciso: sembra una descrizione, ma ha una definizione tecnica implicita che il termine stesso in realtà non descrive. Per dirla semplicemente, ci sono funzioni come codici di autenticazione dei messaggi (MAC) che sono spesso etichettati come funzioni hash e offrono qualche forma di sicurezza crittografica, ma non sono "funzioni hash crittografiche" nella definizione convenzionale.

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

  • Seconda resistenza preimage: per un valore casuale m1 scelto da una parte onesta, è molto costoso per un utente malintenzionato trovare qualsiasi valore m2 ≠ m1 tale che hash(m1) = hash(m2) .
  • Resistenza alla preimage: per un valore casuale h scelto da una parte onesta, è molto costoso per un utente malintenzionato trovare qualsiasi valore m tale che hash(m) = h .
  • Resistenza alla collisione: è molto costoso per un utente malintenzionato trovare qualsiasi coppia di valori m1 ≠ m2 tale che hash(m1) = hash(m2) .

Esiste una quarta proprietà che le vecchie funzioni hash crittografiche falliscono banalmente, ma quali sono le versioni più recenti come SHA-3 e Blake2:

  • Random oracle indifferentiability: Questo è quasi impossibile da spiegare brevemente, ma lasciamolo scusare per questo: è molto costoso per un utente malintenzionato trovare correlazioni non casuali tra gli output degli input di loro scelta .

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

    
risposta data 14.09.2017 - 01:52
fonte

Leggi altre domande sui tag