Un hash o checksum crittografico identico per due file significa che sono identici?


57

Ho 2 documenti Excel e voglio verificare se sono esattamente gli stessi, a parte il nome del file.

Ad esempio, i file vengono chiamati fileone.xlse filetwo.xls. A parte i nomi dei file, si presume che il loro contenuto sia identico, ma questo è ciò che voglio controllare.

Ho cercato modi per rivedere questo e senza installare un sacco di plugin. Non sembra un modo semplice.

Ho provato a generare hash MD5 per entrambi i file. Quando gli hash sono identici, significa che il contenuto del file è lo stesso 1: 1?


8
criptohash e talvolta anche hash normali possono essere utili per confrontare file su sistemi diversi o cercare tra un gran numero di file, ma se due file si trovano sullo stesso sistema puoi facilmente confrontarli con cmpsu Unix o fc(confronto di file) su Windows.
dave_thompson_085,

10
shattered.io - SHA1 è un algoritmo di hashing "più forte" di md5 e ancora shattered.io/static/shattered-1.pdf e shattered.io/static/shattered-2.pdf hanno lo stesso valore di hash pur essendo completamente diversi.
polistirolo vola

30
Nota a margine: controlla prima le loro dimensioni. Se hanno dimensioni diverse, non preoccuparti di aprire i file, sono diversi.
Emilio M Bumachar,

42
Versione semplicistica: un hash MD5 è sufficiente per proteggere contro una buona incidente , non è abbastanza buono per evitare agains malizia . Se è abbastanza buono per te, devi decidere in base alle tue circostanze.
Euro Micelli,

9
diff -s file1 file2se dice che sono identici, sono identici (in realtà confronta i file byte per byte in modo da escludere anche le collisioni di hash). i checksum sono usati quando hai solo un hash e un oggetto che si pensa sia identico al creatore di quell'hash.
Bakuriu,

Risposte:


92

Quando gli hash sono identici, significa che il contenuto del file è lo stesso 1: 1?

Tutti i file sono una raccolta di byte (valori 0-255). Se due hash MD5 di file corrispondono, entrambi questi insiemi di byte sono molto probabilmente identici (stesso ordine, stessi valori).

C'è una probabilità molto piccola che due file possano generare lo stesso MD5, che è un hash a 128 bit. La probabilità è:

La probabilità che solo due hash si scontrino accidentalmente è 1/2 128 che è 1 su 340 undecilioni 282 decilioni 366 nonillioni 920 ottilioni 938 settilioni 463 settilioni 463 quintilioni 374 quadrilioni 607 trilioni 431 miliardi 768 milioni 211 mila 456. (da una risposta su StackOverflow )

Gli hash sono pensati per funzionare in "una sola direzione", ovvero prendi un insieme di byte e ottieni un hash, ma non puoi prendere un hash e recuperare un insieme di byte.

La crittografia dipende da questo (è un modo in cui due cose possono essere confrontate senza sapere cosa siano.)

Intorno all'anno 2005, sono stati scoperti metodi per acquisire un hash MD5 e creare dati corrispondenti a tale hash per creare due documenti con lo stesso hash MD5 ( attacco di collisione ). Vedi il commento di @ user2357112 di seguito. Ciò significa che un utente malintenzionato può creare due eseguibili, ad esempio, che hanno lo stesso MD5 e, se dipendi da MD5 per determinare quale fidarsi, verrai ingannato.

Pertanto, MD5 non deve essere utilizzato per la crittografia o la sicurezza. Ad esempio, è negativo pubblicare un MD5 su un sito di download per garantire l'integrità del download. A seconda di un hash MD5 non ti sei generato per verificare che il contenuto dei file o dei dati sia ciò che vuoi evitare.

Se generi il tuo, sai di non essere dannoso con te stesso (si spera). Quindi, per il tuo uso, è OK, ma se vuoi che qualcun altro sia in grado di riprodurlo e desideri pubblicare pubblicamente l'hash MD5, dovrebbe essere usato un hash migliore.


Si noti che è possibile che due file Excel contengano gli stessi valori nelle stesse righe e colonne, ma che il bytestream del file sia completamente diverso a causa della diversa formattazione, stili, impostazioni, ecc.

Se si desidera confrontare i dati nel file, esportarli prima in CSV con le stesse righe e colonne, per eliminare tutta la formattazione, quindi eseguire l'hash o confrontare i CSV.


107
I file Excel e altri documenti di Office possono anche avere hash diversi perché sono stati aperti e salvati di nuovo senza cambiare nulla, a causa dei metadati nel file con un nuovo valore archiviato per l'ultimo datetime salvato.
BeowulfNode42,

29
Bonus: se hai esportato in CSV, puoi usare l' diffutilità venerabile o simile per confermare effettivamente che i file sono identici byte per byte, piuttosto che avere lo stesso hash.
Monty Harder,

18
Prendere un hash e creare dati che corrispondono all'hash è un attacco preimage. Credo che MD5 sia attualmente vulnerabile agli attacchi di collisione, ma non credo che gli attacchi pre-immagine o di seconda pre-immagine siano attualmente praticabili.
user2357112

2
@Tim cosa stai dicendo? Ha detto: esportali in CSV e usa diff -sper verificare se i CSV sono identici. In effetti è possibile diff -sanche i file Excel: se diffdice che sono identici, non è necessario andare al confronto CSV.
Bakuriu,

2
@Bakuriu Chiaramente il mio commento è stato formulato in modo molto scadente - intendevo dire che l'esportazione in CSV perderà molte informazioni, in particolare formule, grafici, formattazione condizionale e standard.
Tim

37

In pratica, sì, un hash crittografico identico significa che i file sono gli stessi, a condizione che i file non siano stati creati da un utente malintenzionato o da un'altra entità malevola. Le probabilità di collisioni casuali con qualsiasi funzione hash crittografica ben progettata sono così piccole da essere trascurabili nella pratica e in assenza di un attaccante attivo.

In generale, tuttavia, no, non possiamo dire che due file arbitrari con lo stesso hash significhino sicuramente che sono identici.

Il modo in cui funziona una funzione hash crittografica è quello di prendere un input di lunghezza arbitraria e di generare un valore di lunghezza fissa calcolato dall'input. Alcune funzioni hash hanno più lunghezze di output tra cui scegliere, ma l'output è ancora in una certa misura un valore di lunghezza fissa. Questo valore sarà lungo fino a poche decine di byte; gli algoritmi hash con il valore di output più lungo oggi in uso comune hanno un output a 512 bit e un output a 512 bit è 64 byte.

Se un input per una funzione hash è più lungo dell'output della funzione hash, è necessario rimuovere un po 'di fedeltà per adattare l'input all'output. Di conseguenza, devono esistere più input di lunghezze superiori alla lunghezza dell'output, che generano lo stesso output.

Prendiamo come esempio l'attuale cavallo di battaglia, SHA-256. Emette un hash di 256 bit o 32 byte. Se hai due file ciascuno lungo esattamente 32 byte, ma diversi, questi dovrebbero (presupponendo che non vi siano difetti nell'algoritmo) con hash su valori diversi, indipendentemente dal contenuto dei file; in termini matematici, l'hash è una funzione che mappa uno spazio di 2 256 input su uno spazio di 2 256 output, che dovrebbe essere possibile fare a meno delle collisioni. Tuttavia, se si dispone di due file ciascuno lungo 33 byte, deve esistere una combinazione di input che forniscono lo stesso valore hash di output a 32 byte per entrambi i file, poiché ora stiamo mappando uno spazio di input 2 264 su un 2 256spazio di uscita; qui, possiamo facilmente vedere che dovrebbero esistere, in media, 2 8 ingressi per ogni singola uscita. Portalo oltre e con i file a 64 byte dovrebbero esistere 2 256 input per ogni singolo output!

Le funzioni hash crittografiche sono progettate in modo tale che sia computazionalmente difficile comporre un input che dia un output particolare o comporre due input che danno lo stesso output. Questo è noto come resistenza all'attacco preimage o resistenza all'attacco di collisione . Non è impossibile trovare queste collisioni; è solo destinato a essere davvero, davvero, davvero difficile. (Un po 'di un caso speciale di un attacco di collisione è un attacco di compleanno .)

Alcuni algoritmi sono migliori di altri nel resistere agli attaccanti. L'MD5 è generalmente considerato completamente rotto in questi giorni, ma l'ultima volta che ho guardato, mostrava ancora una buona resistenza preimage . Anche SHA-1 è effettivamente rotto; gli attacchi pre-immagine sono stati dimostrati, ma richiedono condizioni specifiche, anche se non c'è motivo di credere che ciò accadrà indefinitamente; come dice il proverbio, gli attacchi migliorano sempre, non peggiorano mai. SHA-256/384/512 sono attualmente ancora ritenuti sicuri per la maggior parte degli scopi. Tuttavia , se sei solo interessato a vedere se due non maliziosi, validii file sono gli stessi, quindi ognuno di questi dovrebbe essere sufficiente, perché lo spazio di input è già sufficientemente limitato da interessarti maggiormente alle collisioni casuali. Se hai qualche motivo per credere che i file siano stati creati in modo dannoso, allora devi usare almeno una funzione di hash crittografica che si ritiene attualmente sicura, che pone la barra inferiore su SHA-256.

Il primo preimage è trovare un input che dia un valore hash di output specifico; la seconda preimage è trovare un input che dia lo stesso output di un altro input specificato; la collisione è trovare due input che producono lo stesso output, indipendentemente da ciò che è e talvolta senza considerare ciò che sono input.

Detto questo, è importante tenere presente che i file possono avere rappresentazioni di dati molto diversi e visualizzare comunque esattamente lo stesso. Quindi possono sembrare uguali anche se i loro hash crittografici non corrispondono, ma se gli hash corrispondono, è molto probabile che appaiano uguali.


2
Se gli hash corrispondono, allora i file sono il risultato di una collisione deliberata, oppure non lo sono e quindi sono garantiti gli stessi. La probabilità di una collisione accidentale è puramente teorica. Dire che "se gli hash corrispondono allora è molto probabile che appaiano uguali" è fuorviante: se c'è malizia in corso ed è una situazione di collisione, allora non è probabile che siano uguali, e altrimenti la probabilità è effettivamente zero, non lo è è un evento a bassa probabilità che deve essere difeso.
Gilles 'SO- smetti di essere malvagio'

9
@Gilles: al contrario. La formulazione di Michael è esattamente corretta e "garantita" è fuorviante (o, beh, effettivamente errata). La probabilità che due file con hash identici non corrispondano (nonostante le modifiche dannose) è estremamente bassa e in pratica può essere trascurata. Tuttavia, non è zero . V'è in genere una possibilità, che per qualsiasi ragione ingressi differenti saranno produrre lo stesso hash, e forse anche con una probabilità molto più alta di 2 ^ -128 (algoritmi crittografici sono magia nera, l'algoritmo desiderato può essere viziata in un modo sconosciuto sottile e non abbiamo modo di essere sicuri al 100%).
Damon,

5
@Gilles " effettivamente zero " non è ancora zero , il che significa che c'è ancora qualche probabilità (certamente piccola) che due diversi insiemi di dati provochino lo stesso hash. Non puoi discutere contro questo.
Attie,

5
@Attie: la probabilità che due file non correlati eseguano l'hashing sullo stesso valore è molto inferiore alla probabilità di molte altre cose che possono andare storte (ad es. Errori di bit casuali che danneggiano i file su disco) che non vale la pena proteggersi da corrispondenze casuali. Difendersi dalle partite deliberatamente progettate può essere utile, ma le partite accidentali sono così improbabili che qualsiasi sforzo speso a difendersi da esse potrebbe probabilmente essere speso meglio altrove.
supercat,

3
@Gilles sbagliato. Non puoi in un attimo dirmi che c'è una possibilità, per quanto piccola lo valuti, che possa verificarsi una collisione accidentale, quindi nel beneficiario successivo non può verificarsi alcuna collisione. Dire che è altamente fuorviante in quanto implica una proprietà dell'algoritmo di hashing che è già noto per essere completamente falso.
iheanyi,

10

È un gioco di probabilità ... gli hash sono in grado di rappresentare un numero finito di valori.

Se consideriamo un algoritmo di hashing a 8 bit ipotetico (e molto debole), questo può rappresentare 256 valori distinti. Quando inizi a eseguire i file tramite l'algoritmo, inizierai a eliminare gli hash ... ma in poco tempo inizierai a vedere " collisioni di hash ". Ciò significa che due diversi file sono stati inseriti nell'algoritmo e ha prodotto lo stesso valore hash del suo output. Chiaramente qui, l'hash non è abbastanza forte e non possiamo affermare che "i file con hash corrispondenti hanno lo stesso contenuto ".

L'estensione delle dimensioni dell'hash e l'utilizzo di algoritmi di hash crittografici più potenti può aiutare in modo significativo a ridurre le collisioni e aumentare la fiducia che due file con lo stesso hash abbiano lo stesso contenuto.

Detto questo, non possiamo mai raggiungere la certezza al 100%: non possiamo mai affermare con certezza che due file con lo stesso hash abbiano davvero lo stesso contenuto.

Nella maggior parte / molte situazioni questo va bene e il confronto degli hash è " abbastanza buono ", ma dipende dal modello di minaccia.

Alla fine, se hai bisogno di aumentare i livelli di certezza, ti consiglio di fare quanto segue:

  1. Utilizzare algoritmi di hashing avanzati ( MD5 non è più considerato adeguato se è necessario proteggersi da utenti potenzialmente dannosi)
  2. Utilizzare più algoritmi di hashing
  3. Confronta le dimensioni dei file: un punto dati aggiuntivo può aiutare a identificare potenziali collisioni, ma nota che la collisione MD5 dimostrata non ha dovuto modificare la lunghezza dei dati.

Se devi essere sicuro al 100%, allora inizia con un hash, ma se gli hash corrispondono, seguilo con un confronto byte per byte dei due file.


Inoltre, come sottolineato da altri ... la complessità dei documenti prodotti da applicazioni come Word ed Excel significa che il testo, i numeri, il layout visibile possono essere gli stessi, ma i dati memorizzati nel file possono essere diversi.

Excel è particolarmente dannoso in questo: semplicemente aprendo un foglio di calcolo salvandolo (non aver fatto nulla ) è possibile produrre un nuovo file, con contenuto diverso.


6
L'MD5 non è più considerato adeguato è vero dal punto di vista crittografico ma per il controllo dell'unicità (in assenza di malizia, ad esempio se si controlla l'input) è bello e veloce (e 128 bit dovrebbero essere in abbondanza)
Chris H

4
" seguilo con un confronto byte per byte dei due file. " Se hai intenzione di fare un confronto di file, puoi anche farlo prima ... non ha senso leggere tutti i file per calcolare il loro hash solo per rileggere entrambi i file per confrontarli!
TripeHound,

3
@TripeHound Dipende se i file sono sia locali che non ... se ne hai già uno e stai introducendo un nuovo file nel sistema, se il nuovo file necessita comunque di un hash memorizzato in un database, ecc ... Effettua la chiamata adatta alla tua situazione.
Attie

5
No, non è un gioco di probabilità. Stai fraintendendo quanto sia improbabile una collisione accidentale. Semplicemente non accadrà. Capovolgere un po 'durante il confronto è più probabile. D'altra parte, in alcuni scenari, potrebbe verificarsi una collisione deliberata, e questo non è affatto un gioco di probabilità.
Gilles 'SO- smetti di essere malvagio'

3
@mbrig: un hash a 32 bit avrebbe un rischio significativo di mancata corrispondenza accidentale. Andare a 128 o 256 bit, tuttavia, fa una differenza enorme . Con 128 bit, un miliardo di scimmie che digitano ciascuna un miliardo di documenti realmente casuali di dimensioni decenti avrebbe circa lo 0,3% di probabilità di creare due documenti con lo stesso hash. Con 256 bit, anche se miliardi di scimmie potessero digitare un miliardo di documenti casuali di dimensioni decenti al secondo per un miliardo di anni, la probabilità che uno di quei non miliardi di documenti con valori di hash che coincidono casualmente sarebbe vanificante.
supercat,

6

Se due file hanno lo stesso hash MD5 e non sono stati entrambi appositamente realizzati, sono identici. Quanto sia difficile creare file con lo stesso hash MD5 dipende dal formato del file, non so quanto sia facile con i file Excel.

Quindi, se hai dei file che sono solo in giro e vuoi trovare duplicati, MD5 è sicuro. Se hai scritto uno dei file e l'altro è di dubbia origine, MD5 è ancora sicuro (l'unico modo per ottenere file diversi con lo stesso checksum MD5 è creare entrambi i file). Se qualcuno di cui non ti fidi ti invia una proposta di budget e in seguito invia un altro file che sostengono sia lo stesso, MD5 potrebbe non essere sufficiente.

Per evitare qualsiasi rischio, utilizzare SHA-256 o SHA-512 anziché MD5. Se due file hanno lo stesso hash SHA-256, sono identici. Lo stesso vale per SHA-512. (C'è una possibilità teorica che possano essere diverse, ma la probabilità che ciò accada accidentalmente è molto inferiore alla probabilità che il tuo computer si capovolga un po 'durante la verifica di quanto non sia rilevante. Per quanto riguarda qualcuno che elabora deliberatamente due file con lo stesso hash, nessuno sa come farlo per SHA-256 o SHA-512.)

Se due file Excel hanno hash diversi, allora sono diversi, ma non c'è modo di sapere da quanto differiscono. Potrebbero avere dati identici ma una formattazione diversa, oppure potrebbero differire solo nelle proprietà o potrebbero essere stati salvati da versioni diverse. In effetti, se Excel è qualcosa di simile a Word, il semplice salvataggio di un file ne aggiorna i metadati. Se desideri solo confrontare i dati numerici e di testo e ignorare la formattazione e le proprietà, puoi esportare i fogli di calcolo in CSV per confrontarli.

Se disponi di strumenti Unix / Linux disponibili, puoi utilizzare cmpper confrontare due file. Per confrontare due file sulla stessa macchina, i checksum rendono solo le cose più complicate.


Se due file hanno lo stesso hash MD5 e non sono stati entrambi appositamente realizzati, sono identici. Questo non è corretto Esistono un'infinità di possibili messaggi, ma ci sono solo 2 ^ 64 possibili hash a 64 bit. Si chiama "principio del buco del piccione" : "il principio del buco del piccione afferma che se gli narticoli vengono messi in mcontenitori, con n > malmeno un contenitore deve contenere più di un articolo". Se si creano più di 2 ^ 64 messaggi, si verificheranno collisioni senza alcuna "lavorazione speciale". E potresti solo con 2.
Andrew Henle

@AndrewHenle, MD5 non è 64 bit, è 128. Se la generazione di una collisione accidentale ci porta a scale temporali di morte termica dell'universo, è "possibile" solo per una definizione estremamente accademica (quindi inutile).
Charles Duffy,

@CharlesDuffy Stai assumendo che l'hash sia distribuito casualmente. Non è.
Andrew Henle,

Essere effettivamente equivalente alla distribuzione casuale fa parte della definizione di ciò che costituisce un buon hash crittografico - hai un sacco di round di missaggio per una ragione. Certamente, ci sono algoritmi di hash deboli, ma concentrarsi su quelle debolezze ci porta negli avvertimenti precedentemente dichiarati sugli attacchi intenzionali. (O stai dicendo che MD5 ha mostrato di avere solo 64 bit che sono effettivamente casuali? Devo ammettere che non ho tenuto il passo, quindi è plausibile - link per favore?)
Charles Duffy

@AndrewHenle Non dichiaro che una collisione sia matematicamente impossibile, il che sarebbe sbagliato, ma non pertinente qui. Premetto che non è successo, il che è vero. Il tuo commento non è corretto in un modo che cambia completamente l'affare. Esistono 2 ^ 128 possibili hash MD5, non 2 ^ 64. Questo significa che dovrai generare 2 ^ 128 hash per essere sicuro di generare una collisione. In realtà, entro il paradosso del compleanno, 2 ^ 64 ti darebbe una macroscopica possibilità di una collisione tra gli hash che hai generato (non con un hash generato in precedenza). Ma questo è controverso poiché sappiamo come creare una collisione.
Gilles 'SO- smetti di essere malvagio'

6

Risposta breve: un hash crittografico dovrebbe aiutarti a essere ragionevolmente sicuro che i file con hash corrispondenti siano gli stessi. A meno che non sia stato creato deliberatamente, le possibilità di due file leggermente diversi con valori di hash simili sono ridicolmente ridotte. Ma quando si tratta di confrontare e verificare file che potrebbero essere deliberatamente manomessi, MD5 è una scelta sbagliata. (Usa un'altra funzione hash come SHA3 o BLAKE2.)

Risposta lunga: una funzione di hash ideale è quella che crea un hash crittografico quasi unico per ogni singolo pezzo di dati. In altre parole, sappiamo sicuramente che ci sono due file in questo universo i cui valori di hash si scontrano, la possibilità che questi due file si uniscano naturalmente è ridicolmente piccola.

Dieci anni fa, ho deciso di rimanere il più lontano possibile da MD5. (Certo, fino a ieri, mi sono ricordato della ragione sbagliata per farlo; dieci anni sono tanti, vedi. Ho rivisitato i miei memo passati per ricordare perché e ho modificato questa risposta.) Vedi, nel 1996, MD5 è stato trovato essere suscettibile agli attacchi di collisione. 9 anni dopo, i ricercatori sono stati in grado di creare coppie di documenti PostScript e (ouch!) Certificati X.509 con lo stesso hash! MD5 era chiaramente rotto. (Anche Megaupload.com utilizzava MD5 e c'erano molte collisioni tra hash e pacchiani che all'epoca mi davano problemi.)

Quindi, ho concluso che mentre MD5 era (ed è ancora) affidabile per il confronto di file benigni, si deve smettere di usarlo del tutto. Ho pensato che fare affidamento su di esso abbia il rischio di trasformarsi in indulgenza e falsa fiducia: una volta che inizi a confrontare i file usando i loro hash MD5, un giorno dimentichi la fine della sicurezza e confronti due file che sono stati deliberatamente creati per avere lo stesso hash. Inoltre, è improbabile che CPU e cryptoprocessor aggiungano supporto.

Il poster originale, tuttavia, ha ancora meno motivi per usare MD5, perché:

  1. Finché uno confronta solo due file, il confronto byte per byte è in realtà più veloce della generazione dei propri hash MD5. Per confrontare tre o più file ... beh, ora hai una causa legittima.
  2. L'OP ha specificato "modi per rivedere questo e senza installare un mucchio di plugin". Il comando Get-FileHash di Windows PowerShell può generare hash SHA1, SHA256, SHA384, SHA512 e MD5. Sui computer moderni con supporto hardware per le funzioni hash SHA, la loro generazione è più veloce.

6
Puoi creare la tua funzione hash crittografica di qualsiasi lunghezza tu scelga, vero; ma poi ha una lunghezza fissa e si applica comunque il principio del buco del piccione. La risposta generale è: "confrontando solo i loro hash, non si può essere sicuri che i due file siano identici".
Kamil Maciorowski

2
@KamilMaciorowski In teoria, sì, posso. La mia funzione hash su misura può semplicemente generare una copia del file più grande. Ma non ho alcun interesse a discuterne ulteriormente; la verità è che hai effettuato il downvoting per un motivo che equivale a fare un pignolo solo per dimostrare di essere più intelligente e che ha fallito. Ora non puoi riprendere il voto.

Sono d'accordo con @KamilMaciorowski ... È un gioco di probabilità ... usando un singolo hash, puoi essere " ragionevolmente fiducioso " che i file con hash corrispondenti siano gli stessi, ma non esiste una garanzia al 100%. L'uso di algoritmi migliori o l'utilizzo di più algoritmi può migliorare la tua sicurezza - anche il confronto delle dimensioni dei file può aiutare ... ma non puoi mai essere sicuro al 100% senza controllare byte per byte.
Attie,

1
@Attie Huh! Questo è ciò che intendevo inizialmente. Grazie. 🙏 Solo non ho familiarità con frasi chic come "puoi essere ragionevolmente fiducioso". Scusate. 😜 Tuttavia, ecco perché abbiamo un pulsante di modifica. Personalmente non darei mai una buona risposta solo perché una parola è sbagliata. Lo modifico.

1
A proposito di "cestinare una buona risposta": si noti che per prima cosa mi sono assicurato che non è un refuso e lo intendi davvero; poi ho effettuato il downgrade e allo stesso tempo ti ho dato un feedback, ho rivelato il mio motivo nella speranza che la tua risposta migliorerà. Lo ha fatto, quindi il mio voto negativo non è più. Fondamentalmente ti ho detto cosa penso fosse sbagliato nella tua risposta, Attie ha contribuito a chiarire, hai migliorato la risposta. Dal mio punto di vista, abbiamo gestito bene questa situazione e l'intera storia è andata molto bene. Grazie.
Kamil Maciorowski

5

Ho 2 documenti Excel e voglio verificare se sono esattamente gli stessi, a parte il nome del file.

Da una prospettiva pratica, il confronto diretto dei file per scoprire se sono diversi sarà più veloce rispetto al calcolo di un hash per ciascun file e quindi al confronto di tale hash.

Per calcolare gli hash devi leggere l'intero contenuto di entrambi i file.

Per determinare se sono identici attraverso un confronto diretto, devi solo leggere il contenuto di entrambi i file fino a quando non corrispondono. Una volta trovata la differenza, sai che i file non sono identici e non devi leggere altri dati da nessuno dei due file.

E prima di farlo, puoi semplicemente confrontare le dimensioni dei due file. se le dimensioni differiscono, il contenuto non può essere lo stesso.


Quando si utilizzano due file su un'unità fisica, l'utilizzo di una funzione hash in grado di tenere il passo con la velocità I / O su ciascun file separatamente potrebbe essere leggermente più veloce rispetto al confronto dei file, poiché non sarebbe necessario passare dalla lettura dei due file. Gli hash di posto davvero brillano, tuttavia, è quando si tenta di fare confronti che coinvolgono molti file che sono troppo grandi per adattarsi alla memoria. Anche se vuoi semplicemente scoprire se corrispondono tutti, confrontando il file 1 con il file 2, quindi il file 1 con il file 3, quindi il file 1 con il file 4, ecc. Potrebbero essere quasi due volte più lenti rispetto al calcolo di tutti i loro hash.
supercat

@supercat Se i file vengono letti in blocchi più grandi di circa un MB, il passaggio tra i file non sarà evidente. E se un flusso di lavoro comporta il confronto di un mucchio di file per trovare duplicati, l'hash potrebbe anche essere calcolato come ogni file è scritto, dal momento che farlo può praticamente essere fatto gratuitamente.
Andrew Henle,

Se uno ha abbastanza spazio per bufferizzare grossi blocchi di file, i tempi di commutazione non devono essere un problema, ma altrimenti potrebbero esserlo. Per quanto riguarda il calcolo degli hash quando i file vengono scritti, ciò potrebbe andare bene se si potesse garantire che i file non possano essere modificati senza cambiare o almeno invalidare gli hash memorizzati. Se si sta tentando di evitare il backup dei file in modo ridondante, la ricerca solo dei valori di hash memorizzati può causare il backup di un file danneggiato accidentalmente ma non preoccuparsi di eseguire il backup dei file non danneggiati che il file danneggiato deve corrispondere ma che non corrisponde .
supercat,

"Una volta trovata la differenza, sai che i file non sono identici" - non necessariamente. I file XLSX sono file ZIP che potenzialmente potrebbero archiviare il contenuto in ordine diverso pur mantenendo lo stesso contenuto. Ma anche se li decomprimi e confronti ogni singolo file, il file XLSX contiene documenti XML che potrebbero avere, ad esempio, terminazioni di riga diverse senza influire sul contenuto.
Thomas Weller,

5

Hash come MD5 o SHA hanno una lunghezza fissa, diciamo che sono 300 caratteri alfanumerici (in realtà sono più corti e non usano l'intero set di caratteri alfanumerici).

Diciamo che i file sono fatti di caratteri alfanumerici e di dimensioni fino a 2 GB.

Puoi facilmente vedere che ci sono molti più file (con dimensioni fino a 2 GB) rispetto ai possibili valori di hash. Il principio pigeonhole dice che alcuni (diversi) file devono avere gli stessi valori di hash.

Inoltre, come dimostrato su shattered.io 1 , puoi avere due file diversi: shattered.io/static/shattered-1.pdf e shattered.io/static/shattered-2.pdf che hanno lo stesso valore hash SHA-1 pur essendo completamente differente.

1 SHA1 è un algoritmo di hashing "più forte" di md5


La probabilità di collisioni accidentali è troppo bassa per essere presa in considerazione. Il rischio di una collisione deliberata esiste anche per MD5 ed è peggio che per SHA-1, che non è terribilmente rilevante qui.
Gilles 'SO- smetti di essere malvagio'

4

NO. Valori diversi garantiscono che i file siano diversi. Gli stessi valori non sono garanzia che i file siano gli stessi. È relativamente facile trovare esempi usando CRC16.

A conti fatti, con gli schemi di hashing contemporanei sono gli stessi.


1
La domanda riguarda MD5, che non presenta rischi di collisioni accidentali. Ha il rischio di collisioni deliberate, ma non è una questione di probabilità.
Gilles 'SO- smetti di essere malvagio'

1
Si tratta anche di fogli di calcolo Excel con nomi diversi, quanto possono essere grandi che un byte per il confronto dei byte non può essere un'opzione? Due schemi di hashing insieme fornirebbero certezza.
mckenzm,

2
@Gilles Per definizione, tutti gli hashcode hanno il rischio di collisioni accidentali. L'unica via d'uscita è usare l'intero file come hashcode. Il tuo commento non ha senso.
user207421

3

La tua domanda è al contrario, supponiamo che l'hash significhi che hanno gli stessi dati (che non è garantito al 100%, ma è abbastanza buono per una vita di confrontare i file ogni secondo per non colpire una collisione). Non ne consegue necessariamente che avere gli stessi dati significhi che avranno lo stesso hash. Quindi no: non è possibile confrontare i dati in un file Excel con i dati in un altro file Excel eseguendo l'hashing del file perché ci sono molti modi in cui due file possono differire senza che i dati sottostanti siano diversi. Un modo ovvio: i dati sono archiviati come XML, ogni cella ha il proprio nodo XML. Se tali nodi sono memorizzati in ordini diversi, i dati sono gli stessi ma il file è diverso.



2

La risposta per questo PO è stata fornita ma potrebbe beneficiare di un riepilogo.

Se vuoi verificare se due file sono uguali, molto dipende dal fatto che i file e gli hash siano o meno sotto il tuo controllo.

Se generi tu stesso gli hash dai file e sei abbastanza sicuro che nessun altro abbia avuto opportunità / abilità / motivazione per provare deliberatamente a farti arrivare a una conclusione sbagliata, allora quasi tutti gli hash - anche gli hash "conosciuti rotti" come MD5 e SHA1 sono quasi certo di essere sufficiente. Ma questo, voglio dire, potresti generare file ad alta velocità per milioni di anni e sarebbe comunque improbabile che tu finisca con due file che sono effettivamente diversi ma hanno lo stesso hash. È quasi certamente sicuro.

Questo è lo scenario che hai, quando vuoi verificare rapidamente se due directory sul tuo PC o file server hanno lo stesso contenuto, se tutti i file in una directory sono duplicati esatti, ecc., E sei abbastanza sicuro che i file non abbiano è stato progettato / modificato illecitamente e ti fidi della tua app / utility di hashing per fornire risultati corretti.

Se ti trovi in ​​uno scenario in cui uno dei file - o un hash precalcolato - potrebbe essere stato manipolato o progettato per trarre in inganno una conclusione errata, allora hai bisogno di un hash più forte (ininterrotto) e / o di altra sicurezza. Ad esempio, se si scarica un file e si verifica se è valido esaminando un hash, un utente malintenzionato potrebbe essere in grado di progettare un file errato con l'hash corretto o attaccare il sito Web per posizionare un hash errato quando si cerca il "giusto " (valore atteso. Questo dipende da problemi di sicurezza più ampi.


2

Sulla riga di comando di Windows, è possibile utilizzare l' computilità per determinare se due file sono esattamente uguali. Per esempio:

comp fileone.xls filetwo.xls

1

Quando gli hash sono identici, significa che il contenuto del file è lo stesso 1: 1?

No. Se gli hash sono diverse, si fa mezzo che i contenuti sono diversi. Gli hashcode uguali non implicano lo stesso contenuto. Un hashcode è una riduzione di un dominio di grandi dimensioni a un intervallo più piccolo, per definizione: l'implicazione è che i codici hash su contenuto disuguale possono essere uguali. Altrimenti non avrebbe senso calcolarli.


Altrimenti non avrebbe senso calcolarli. Se hai infranto le leggi della matematica e hai inventato una funzione di compressione senza perdita di dati in grado di comprimere i dati casuali, violando il principio del buco del piccione, sarebbe molto utile usarli! Sarebbe altamente conveniente se un hash a 128 bit ha rappresentano unicamente l'intero contenuto di un file. Anche se non esistesse alcuna funzione di decompressione per ripristinare l'hash nel file, sarebbe piacevole avere un hash matematicamente impossibile senza collisioni, ad esempio per accelerare la ricerca di dati duplicati in dati non attendibili come nelle immagini VM.
Peter Cordes,

"Se gli hash sono diversi, significa che i contenuti sono diversi." Non necessariamente. I file XLSX sono file ZIP e sarebbe possibile avere lo stesso contenuto archiviato in un ordine di file diverso.
Thomas Weller,

1

Questa risposta vuole essere una comoda mappa di scenari che possono o non possono accadere e ragionamenti che puoi applicare. Consulta le altre risposte per scoprire perché le funzioni hash funzionano in questo modo.


Dopo aver scelto una funzione hash e attenersi ad essa, queste sono tutte le combinazioni da considerare:

          |    identical   |   different    |
          |   hash values  |  hash values   |
----------+----------------+----------------+
identical |   can happen,  | cannot happen, |
  files   |     common     |   impossible   |
----------+----------------+----------------+
different |   can happen,  |   can happen,  |
  files   |      rare*     |     common     |
----------+----------------+----------------+

* rare, unless whoever generates (at least one of) the files
  purposely aims at this scenario

Lo scenario in cui file identici generano valori di hash diversi è l'unico che è assolutamente impossibile.


Due ragionamenti che si applicano sempre :

  • Se i file sono identici, i valori di hash sono sicuramente identici .
  • Se i valori di hash sono diversi, i file sono sicuramente diversi .

Due ragionamenti che non sono rigidi :

  • Se i file sono diversi, probabilmente i valori di hash sono diversi.
  • Se i valori di hash sono identici, probabilmente i file sono identici.

0

Per i tuoi scopi, sì, hash identici significano file identici.

Come altre risposte chiariscono, è possibile costruire 2 file diversi che generano lo stesso hash e MD5 non è particolarmente robusto in questo senso.

Quindi usa un algoritmo di hashing più forte se prevedi di confrontare un gran numero di documenti Excel o se pensi che qualcuno potrebbe voler manipolare il confronto. SHA1 è meglio di MD5. SHA256 è di nuovo migliore e dovrebbe darti completa fiducia per il tuo particolare utilizzo.


-1

I file sono probabilmente identici se i loro hash sono identici. È possibile aumentare la sicurezza modificando entrambi i file in modo identico (ad esempio, inserire lo stesso valore nella stessa cella non utilizzata), quindi confrontando gli hash dei file modificati. È difficile creare una collisione deliberata per un file che viene modificato in un modo non noto in anticipo.


Questo non funzionerà a causa dei dati aggiuntivi memorizzati nei file di Office. È necessario, ad esempio, posizionare il cursore nella stessa cella prima di salvare, salvare all'ora esatta ecc. Ma anche in questo caso, i file XLSX sono file zip internamente, quindi se tale algoritmo memorizza i singoli file in un ordine diverso (per qualsiasi scopo), il file è identico ma l'hash non lo è
Thomas Weller,

-2

Diamo un'occhiata a questo in modo pratico. Invece di dire "gli hash sono identici" Dirò "Ho scritto un programma per computer che calcola gli hash di due file e stampa se sono uguali o no", e eseguo il programma con due file, e dice "identico". Ci sono diversi motivi per cui potrebbe farlo:

I file possono essere identici. Il mio codice potrebbe avere dei bug (uno che è effettivamente accaduto in pratica è stato il confronto di due hash lunghi (256 byte) non con memcmp ma con strcmp: il confronto restituirà "stesso" se il primo byte in ciascun hash è zero e la possibilità di ovvero 1 su 65536. Potrebbe esserci un errore hardware (raggio cosmico che colpisce una cella di memoria e la commuta). Oppure potresti avere il raro caso di due file diversi con hash identico (una collisione hash).

Direi che per file non identici, la causa di gran lunga più probabile è l'errore del programmatore, poi arriva il raggio cosmico che ha cambiato una variabile booleana con il risultato di confrontare gli hash da "falso" a "vero", e molto dopo la coincidenza di una collisione di hash.

Esistono sistemi di backup aziendali che evitano di eseguire il backup di file identici da 10.000 utenti eseguendo l'hashing di ciascun file e verificando la presenza di un file con un hash identico già memorizzato sul server. Quindi, in caso di collisione, non verrà eseguito il backup di un file, con conseguente perdita di dati. Qualcuno ha calcolato che è molto più probabile che un meteorite colpisca il tuo server e distrugga tutti i backup piuttosto che perdere un file perché il suo checksum corrispondeva a un altro file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.