b'\n_START_ARTICLE_\nFunzione crittografica di hash\n_START_SECTION_\nIdentificatore di file o dati\n_START_PARAGRAPH_\nIn quelle applicazioni in cui si necessita di gestire grandi quantitativi di file, un digest dei messaggi pu\xc3\xb2 anche essere utile nell\'identificazione di essi in maniera affidabile. Diversi sistemi di gestione di codice sorgente, tra cui Git, Mercurial e Monotone, utilizzano il sha1sum (un algoritmo che calcola e verifica gli hash SHA-1) di vari tipi di contenuti (contenuti di file, alberi di directory, informazioni genealogiche, ecc.) per identificarli in modo univoco. Lo stesso obiettivo vuole essere raggiunto dalle reti di condivisione di file peer-to-peer dove, ad esempio, in un link ed2k, un hash di tipo MD4 \xc3\xa8 combinato con la dimensione del file, fornendo informazioni sufficienti per individuare le origini del file stesso, scaricarlo e verificarne il contenuto. I collegamenti magnetici (magnet links) ne costituisce un altro esempio. Avendo a disposizione funzioni hash di un certo tipo, una delle principali applicazioni delle funzioni crittografiche \xc3\xa8 quella di consentire la rapida ricerca di dati in una tabella hash. Tuttavia, rispetto alle funzioni di hash standard, le funzioni crittografiche di hash tendono ad essere pi\xc3\xb9 dispendiose in termini di calcolo. Per questo motivo, vengono utilizzate in contesti in cui \xc3\xa8 necessario che gli utenti siano protetti dalla possibilit\xc3\xa0 di contraffazione (creazione di dati con lo stesso digest) da parte di partecipanti potenzialmente dannosi.\n_START_SECTION_\nGenerazione di numeri pseudocasuali e chiavi di derivazione\n_START_PARAGRAPH_\nLe funzioni di hash possono essere impiegate anche per la generazione di stringhe pseudorandom o per la derivazione di chiavi e password da una singola chiave o password sicura.\n_START_SECTION_\nFunzioni di hash basate su cifrari a blocchi\n_START_PARAGRAPH_\nEsistono diversi metodi per usare i cifrari a blocchi per la creazione di una funzione crittografica di hash, o meglio, di una funzione di compressione a senso unico. I metodi di applicazione somigliano alle modalit\xc3\xa0 di funzionamento dei cifrari a blocchi utilizzate di solito nella crittografia. Molte funzioni di hash ben note, tra cui MD4, MD5, SHA-1 e SHA-2, sono costruite da componenti di cifratura a blocchi adatti allo scopo, con dei feedback per assicurare che la funzione risultante non sia invertibile. I finalisti di SHA-3 includevano delle funzioni con componenti di cifratura a blocchi (ad esempio Sklein o BLAKE), anche se, successivamente, \xc3\xa8 stata scelta la funzione Keccak, costruita invece su una funzione spugna. \xc3\x88 possibile utilizzare un cifrario a blocchi standard come AES al posto di cifrari a blocchi custom, che potrebbero essere utili quando un sistema embedded ha bisogno di implementare sia la crittografia che l\'hashing con dimensioni minime di codice o area hardware. Tale approccio per\xc3\xb2, pu\xc3\xb2 avere costi in efficienza e sicurezza._NEWLINE_I cifrari nelle funzioni di hash sono costruiti per l\'hashing: essi usano grosse chiavi e blocchi, possono modificare in maniera efficiente le chiavi di ogni blocco e sono state progettate e verificate per la resistenza agli attacchi delle chiavi correlate. I cifrari di uso generale tendono ad avere diversi obiettivi di progettazione; in particolare, AES ha dimensioni di chiavi e di blocchi che lo rendono non banale da utilizzare per generare lunghi valori di hash. La crittografia AES diventa meno efficace quando la chiave cambia ogni blocco e gli attacchi relativi alla chiave lo rendono potenzialmente meno sicuro per l\'utilizzo in una funzione hash, quanto nella crittografia.\n_START_SECTION_\nCostruzione di Merkle-Damg\xc3\xa5rd\n_START_PARAGRAPH_\nUna funzione di hash deve essere in grado di elaborare un messaggio di lunghezza arbitraria in un output di lunghezza fissa: ci\xc3\xb2 pu\xc3\xb2 essere ottenuto spezzando l\'input in una serie di blocchi di uguale dimensione e operando su di essi in sequenza usando una funzione di compressione a senso unico. La funzione di compressione pu\xc3\xb2 essere progettata appositamente per l\'hashing o per essere costruita da una cifratura a blocchi. Una funzione di hash costruita con la costruzione di Merkle-Damg\xc3\xa5rd \xc3\xa8 resistente alle collisioni e alla sua funzione di compressione; qualsiasi collisione per la funzione di hash completa pu\xc3\xb2 essere ricondotta ad una collisione nella funzione di compressione._NEWLINE_Nella costruzione di Merkle-Damg\xc3\xa5rd, l\'ultimo blocco processato deve essere "imbottito" senza ambiguit\xc3\xa0 di una lunghezza padding: questo passaggio \xc3\xa8 fondamentale per la sicurezza di questa costruzione._NEWLINE_Le forme classiche di hash pi\xc3\xb9 comuni, tra cui SHA-1 e MD5 assumono questa forma.\n_START_SECTION_\nDifferenza tra hash a pipe stretta ed hash a pipe larga\n_START_PARAGRAPH_\nUn\'applicazione diretta della costruzione di Merkle-Damg\xc3\xa5rd, dove la dimensione dell\'uscita hash \xc3\xa8 uguale alla dimensione dello stato interno (tra ogni fase di compressione), si traduce in un disegno di hash a pipe stretta (narrow pipe). Questo disegno causa molti difetti, tra cui estensioni di lunghezza, multicollisione, attacchi di messaggi lunghi, attacchi di generate-and-paste e non possono essere parallelizati. Di conseguenza, le costruzioni moderne prevedono un hash a pipe larga (wide-pipe) che hanno una dimensione maggiore dello stato interno, che vanno dai ritocchi della costruzione di Merkle-Damg\xc3\xa5rd a nuove costruzioni come la costruzione spugna e la costruzione di HAIFA. Nessuno dei partecipanti al concorso della funzione hash NIST utilizza una costruzione classica di Merkle-Damg\xc3\xa5rd._NEWLINE_Nel frattempo, troncare l\'output di un hash pi\xc3\xb9 lungo, come viene fatto in SHA-512/256, sconfigge anche molti di questi attacchi.\n_START_SECTION_\nUtilizzo per la costruzione di altre primitive crittografiche\n_START_PARAGRAPH_\nLe funzioni di hash possono essere usate per costruire altre primitive crittografiche: per fare in modo che siano protette in modo crittografico, occorre prestare attenzione nel costruirle correttamente._NEWLINE_I codici di autenticazione dei messaggi (MAC), chiamati anche funzioni di hash con chiave, sono spesso costruite mediante funzioni di hash. HMAC si comporta come un MAC._NEWLINE_Proprio come i cifrari a blocchi possono essere usati per generare delle funzioni hash, vale il viceversa, ovvero anche quest\'ultime possono essere utilizzate per costruire dei cifrari a blocchi. Le costruzioni di Luby-Rackoff, che utilizzano le funzioni di hash, possono essere sicure solo se la funzione di hash sottostante \xc3\xa8 altrettanto sicura. Inoltre, molte funzioni di hash (tra cui SHA-1 e SHA-2) sono costruite utilizzando una speciale cifratura a blocchi nel Davies-Meyer o in un\'altra costruzione. Questo cifrario pu\xc3\xb2 essere anche utilizzato per funzionare in modo convenzionale, senza le stesse garanzie di sicurezza (vedasi SHACAL, BEAR e LION)._NEWLINE_Anche i generatori di numeri pseudocasuali (PRNG) possono essere costruiti usando le funzioni hash; per fare questo si combina un seme casuale (segreto) con un contatore, dopodich\xc3\xa9 si effettua l\'hashing._NEWLINE_Alcune funzioni di hash, come Sklein, Keccak e RadioGat\xc3\xban generano in output un flusso arbitrariamente lungo e possono essere utilizzati come un cifrario a flusso. Anche i cifrari a flusso possono essere costituiti dal digest di lunghezza fissa delle funzioni hash: questo viene fatto costruendo dapprima un generatore di numeri pseudocasuali crittograficamente sicuro, poi utilizzando il suo flusso di byte casuali come keystream. A tal proposito, SEAL \xc3\xa8 un cifrario di flusso che utilizza SHA-1 per generare tabelle interne, che vengono poi utilizzate in un generatore di keystream pi\xc3\xb9 o meno correlate all\'algoritmo di hash. SEAL per\xc3\xb2, non \xc3\xa8 garantita per essere forte (o debole) come SHA-1._NEWLINE_Allo stesso modo, l\'espansione della chiave dei cifrari a flusso HC-128 e HC-256 fa parecchio uso della funzione hash SHA256.'