Apakah hash atau checksum kriptografi identik untuk dua file berarti mereka identik?

57

Saya memiliki 2 dokumen excel dan saya ingin memeriksa apakah keduanya persis sama, terlepas dari nama file.

Sebagai contoh, file dipanggil fileone.xlsdan filetwo.xls. Terlepas dari nama file, isinya dianggap identik tetapi inilah yang ingin saya periksa.

Saya telah mencari cara untuk meninjau hal ini dan tanpa menginstal banyak plugin. Tampaknya tidak ada jalan lurus ke depan.

Saya sudah mencoba menghasilkan hash MD5 untuk kedua file. Ketika hash identik, apakah ini berarti bahwa isi file 1: 1 sama?

sam
sumber
8
cryptohash dan terkadang hash normal dapat berguna untuk membandingkan file pada sistem yang berbeda, atau mencari di antara sejumlah besar file, tetapi jika dua file berada pada sistem yang sama Anda dapat dengan mudah membandingkannya dengan cmpdi Unix atau fc(membandingkan file) pada Windows.
dave_thompson_085
10
shattered.io - SHA1 adalah algoritma hashing yang "lebih kuat" dari pada md5 dan masih dihancurkan.io/static/shattered-1.pdf dan shattered.io/static/shattered-2.pdf memiliki nilai hash yang sama namun sama sekali berbeda.
terbang styrofoam
30
Catatan: periksa ukurannya terlebih dahulu. Jika mereka memiliki ukuran yang berbeda, jangan repot-repot membuka file, mereka berbeda.
Emilio M Bumachar
42
Versi sederhana: hash MD5 cukup baik untuk melindungi dari kecelakaan , tidak cukup baik untuk mencegah kejahatan . Apakah itu cukup baik untuk Anda, Anda harus memutuskan berdasarkan keadaan Anda.
Euro Micelli
9
diff -s file1 file2jika dikatakan mereka identik, mereka identik (sebenarnya membandingkan file byte-per-byte sehingga bahkan tabrakan hash dikecualikan). checksum digunakan ketika Anda hanya memiliki satu hash dan item yang dianggap identik dengan pencetus hash itu.
Bakuriu

Jawaban:

92

Ketika hash identik, apakah ini berarti bahwa isi file 1: 1 sama?

Semua file adalah kumpulan byte (nilai 0-255). Jika dua file hash MD5 cocok, kedua koleksi byte tersebut sangat mungkin sama persis (urutan yang sama, nilai yang sama).

Ada kemungkinan sangat kecil bahwa dua file dapat menghasilkan MD5 yang sama, yang merupakan hash 128 bit. Probabilitasnya adalah:

Kemungkinan hanya dua hash yang bertabrakan secara tidak sengaja adalah 1/2 128 yang berarti 1 dari 340 undecillion 282 decillion 366 nonillion 920 octillion 938 septillion 463 sextillion 463 quintillion 374 quadrillion 607 triliun 431 miliar 768 juta 211.000 456. (dari jawaban di StackOverflow ).

Hash dimaksudkan untuk bekerja dalam "satu arah saja" - yaitu Anda mengambil koleksi byte dan mendapatkan hash, tetapi Anda tidak dapat mengambil hash dan mendapatkan kembali koleksi byte.

Kriptografi tergantung pada ini (itu adalah satu cara dua hal dapat dibandingkan tanpa mengetahui hal-hal itu.)

Sekitar tahun 2005, metode ditemukan untuk mengambil hash MD5 dan membuat data yang cocok dengan hash membuat dua dokumen yang memiliki hash MD5 yang sama ( collision attack ). Lihat komentar @ user2357112 di bawah ini. Ini berarti penyerang dapat membuat dua executable, misalnya, yang memiliki MD5 yang sama, dan jika Anda bergantung pada MD5 untuk menentukan mana yang harus dipercaya, Anda akan tertipu.

Dengan demikian MD5 tidak boleh digunakan untuk kriptografi atau keamanan. Misalnya, menerbitkan MD5 di situs unduhan untuk memastikan integritas unduhan, misalnya. Bergantung pada hash MD5 Anda tidak membuat sendiri untuk memverifikasi file atau konten data adalah apa yang ingin Anda hindari.

Jika Anda menghasilkan milik Anda sendiri, Anda tahu Anda tidak jahat pada diri sendiri (semoga). Jadi untuk penggunaan Anda, tidak apa-apa, tetapi jika Anda ingin orang lain dapat mereproduksinya, dan Anda ingin mempublikasikan hash MD5 secara publik, hash yang lebih baik harus digunakan.


Perhatikan bahwa dua file Excel mungkin berisi nilai yang sama di baris dan kolom yang sama, tetapi untuk bytestream file menjadi sangat berbeda karena perbedaan format, gaya, pengaturan, dll.

Jika Anda ingin membandingkan data dalam file, ekspor ke CSV dengan baris dan kolom yang sama terlebih dahulu, untuk menghapus semua pemformatan, lalu hash atau bandingkan CSV.

LawrenceC
sumber
107
File Excel, dan dokumen kantor lainnya juga dapat memiliki hash yang berbeda karena telah dibuka dan disimpan kembali tanpa mengubah apa pun, karena metadata dalam file tersebut memiliki nilai baru yang disimpan di sana untuk waktu tersimpan yang terakhir.
BeowulfNode42
29
Bonus: jika Anda telah diekspor ke CSV, Anda dapat menggunakan diffutilitas yang terhormat atau serupa untuk benar-benar mengkonfirmasi file yang byte-for-byte identik, daripada hanya memiliki hash yang sama.
Monty Harder
18
Mengambil hash dan membuat data yang cocok dengan hash adalah serangan preimage. Saya percaya MD5 saat ini rentan terhadap serangan tabrakan, tetapi saya tidak berpikir serangan preimage atau preimage kedua saat ini layak.
user2357112
2
@Tim, apa yang kamu katakan? Dia berkata: ekspor mereka ke CSV dan gunakan diff -suntuk memeriksa apakah CSV itu identik. Bahkan Anda dapat diff -sbahkan file excel: jika diffmengatakan mereka identik Anda tidak perlu pergi ke perbandingan CSV.
Bakuriu
2
@ Bakuriu Jelas komentar saya sangat buruk - saya bermaksud mengekspor ke CSV akan kehilangan banyak informasi - terutama formula, grafik, pemformatan bersyarat dan standar.
Tim
37

Dalam praktiknya, ya, hash kriptografi identik berarti file-nya sama, selama file-file itu tidak dibuat oleh penyerang atau entitas jahat lainnya. Peluang tabrakan acak dengan fungsi hash kriptografi yang dirancang dengan baik sangat kecil sehingga dapat diabaikan dalam praktik dan tanpa adanya penyerang aktif.

Secara umum, bagaimanapun, tidak, kita tidak dapat mengatakan bahwa dua file arbitrer yang memiliki hash yang sama jelas berarti bahwa mereka identik.

Cara fungsi hash kriptografi bekerja adalah dengan mengambil input panjang arbitrer, dan menampilkan nilai panjang tetap yang dihitung dari input. Beberapa fungsi hash memiliki panjang output ganda untuk dipilih, tetapi outputnya sampai batas tertentu memiliki nilai panjang tetap. Nilai ini akan mencapai beberapa lusin byte; algoritma hash dengan nilai output terpanjang yang umum digunakan saat ini memiliki output 512-bit, dan output 512-bit adalah 64 byte.

Jika input ke fungsi hash lebih panjang dari output fungsi hash, beberapa kesetiaan harus dihilangkan untuk membuat input sesuai dengan output. Akibatnya, harus ada beberapa input dengan panjang lebih besar dari panjang output, yang menghasilkan output yang sama.

Mari kita ambil pekerja keras saat ini, SHA-256, sebagai contoh. Ini menghasilkan hash 256 bit, atau 32 byte. Jika Anda memiliki dua file yang panjangnya masing-masing tepat 32 byte, tetapi berbeda, ini harus (dengan asumsi tidak ada cacat dalam algoritma) hash ke nilai yang berbeda, tidak peduli isi file; dalam istilah matematika, hash adalah fungsi pemetaan 2 256 ruang input ke sebuah 2 256 ruang output, yang harus mungkin untuk melakukannya tanpa tabrakan. Namun, jika Anda memiliki dua file yang masing-masing berukuran 33 byte, harus ada beberapa kombinasi input yang memberikan nilai hash output 32-byte yang sama untuk kedua file tersebut, karena kami sekarang memetakan ruang input 2 264 ke ruang 2 256ruang keluaran; di sini, kita dapat dengan mudah melihat bahwa harus, rata-rata, ada 2 8 input untuk setiap output. Ambillah ini lebih lanjut, dan dengan file 64-byte harus ada 2 256 input untuk setiap output tunggal!

Fungsi hash kriptografi dirancang sedemikian rupa sehingga sulit secara komposisional untuk menyusun input yang memberikan output tertentu, atau menulis dua input yang memberikan output yang sama. Ini dikenal sebagai resistensi serangan preimage atau resistensi serangan tubrukan . Bukan tidak mungkin menemukan tabrakan ini; itu hanya dimaksudkan untuk menjadi sangat, sangat, sangat, sangat sulit. (Sedikit kasus khusus dari serangan tabrakan adalah serangan ulang tahun .)

Beberapa algoritma lebih baik daripada yang lain dalam melawan penyerang. MD5 umumnya dianggap benar-benar rusak akhir-akhir ini, tetapi terakhir saya melihat, itu masih memiliki resistensi preimage pertama yang cukup bagus . SHA-1 juga rusak secara efektif; serangan preimage telah diperlihatkan, tetapi membutuhkan kondisi khusus, meskipun tidak ada alasan untuk percaya bahwa itu akan terjadi tanpa batas waktu; seperti kata pepatah, serangan selalu menjadi lebih baik, mereka tidak pernah menjadi lebih buruk. SHA-256/384/512 saat ini masih diyakini aman untuk sebagian besar tujuan. Namun , jika Anda hanya tertarik untuk melihat apakah dua yang dibuat tidak jahat, validfile adalah sama, maka semua ini harus memadai, karena ruang input sudah cukup dibatasi sehingga Anda akan lebih tertarik pada tabrakan acak. Jika Anda memiliki alasan untuk meyakini bahwa file tersebut dibuat dengan cara jahat, maka Anda harus setidaknya menggunakan fungsi hash kriptografi yang saat ini diyakini aman, yang menempatkan bilah bawah di SHA-256.

Preimage pertama adalah menemukan input yang menghasilkan nilai hash output spesifik; preimage kedua adalah menemukan satu input yang memberikan output yang sama dengan input lain yang ditentukan; tabrakan adalah untuk menemukan dua input yang menghasilkan output yang sama, tanpa memperhatikan apa itu dan kadang-kadang tanpa memperhatikan apa input tersebut.

Semua yang dikatakan, penting untuk diingat bahwa file mungkin memiliki representasi data yang sangat berbeda dan masih menampilkan persis sama. Jadi mereka dapat tampak sama meskipun hash kriptografisnya tidak cocok, tetapi jika hash cocok maka mereka sangat mungkin tampak sama.

sebuah CVn
sumber
2
Jika hash cocok maka file-file tersebut adalah hasil dari tabrakan yang disengaja, atau mereka tidak dan kemudian mereka dijamin akan sama. Probabilitas tabrakan tidak disengaja adalah murni teoretis. Mengatakan bahwa "jika hash cocok maka mereka sangat mungkin terlihat sama" adalah menyesatkan: jika ada kejahatan sedang terjadi dan itu adalah situasi tabrakan maka mereka tidak akan sama, dan jika tidak, probabilitasnya secara efektif nol, itu bukan Ada beberapa peristiwa probabilitas rendah yang perlu dipertahankan.
Gilles 'SANGAT berhenti menjadi jahat'
9
@Gilles: Sebaliknya. Kata-kata Michael benar, dan "dijamin" menyesatkan (atau, well, faktual salah). Kemungkinan dua file dengan hash identik tidak cocok (walaupun modifikasi berbahaya) sangat rendah, dan dapat diabaikan dalam praktiknya. Namun, ini bukan nol . Secara umum ada kemungkinan, bahwa untuk alasan apa pun input yang berbeda akan menghasilkan hash yang sama, dan bahkan mungkin dengan kemungkinan jauh lebih tinggi dari 2 ^ -128 (algoritma kriptografi adalah seni hitam, algortihm dapat cacat dalam cara yang halus, tidak diketahui dan kami tidak mungkin 100% pasti).
Damon
5
@Gilles " secara efektif nol " masih belum nol , yang berarti masih ada beberapa kemungkinan (memang kecil) bahwa dua set data yang berbeda akan menghasilkan hash yang sama. Anda tidak bisa membantah hal itu.
Attie
5
@ Attie: Probabilitas dua file yang tidak terkait hashing dengan nilai yang sama jauh di bawah probabilitas banyak hal lain yang bisa salah (mis. Kesalahan bit acak merusak file pada disk) yang tidak layak dijaga terhadap pertandingan yang kebetulan. Melindungi dari pertandingan yang direkayasa dengan sengaja mungkin bermanfaat, tetapi pertandingan yang tidak disengaja sangat tidak mungkin dilakukan sehingga upaya yang dilakukan untuk melindungi mereka kemungkinan bisa dihabiskan lebih baik di tempat lain.
supercat
3
@Gilles salah. Anda tidak dapat dalam satu nafas memberi tahu saya bahwa ada peluang, betapapun kecilnya Anda menilai, bahwa tabrakan tidak disengaja dapat terjadi kemudian pada penerima berikutnya, tabrakan tidak akan terjadi. Mengatakan itu sangat menyesatkan karena menyiratkan properti dari algoritma hashing yang sudah diketahui sepenuhnya salah.
iheanyi
10

Ini adalah permainan probabilitas ... hash mampu mewakili sejumlah nilai hingga.

Jika kita menganggap algoritma hashing 8-bit hipotetis (dan sangat lemah), maka ini dapat mewakili 256 nilai yang berbeda. Saat Anda mulai menjalankan file melalui algoritme, Anda akan mulai mengeluarkan hash ... tetapi tidak lama kemudian Anda akan mulai melihat " tabrakan hash ". Ini berarti bahwa dua file berbeda dimasukkan ke dalam algoritma, dan menghasilkan nilai hash yang sama dengan outputnya. Jelas di sini, hash tidak cukup kuat, dan kami tidak dapat menyatakan bahwa " file dengan hash yang cocok memiliki konten yang sama ".

Memperluas ukuran hash, dan menggunakan algoritma hashing kriptografi yang lebih kuat dapat secara signifikan membantu mengurangi tabrakan, dan meningkatkan kepercayaan kami bahwa dua file dengan hash yang sama memiliki konten yang sama.

Ini mengatakan, kami tidak pernah dapat mencapai kepastian 100% - kami tidak pernah dapat mengklaim dengan pasti bahwa dua file dengan hash yang sama benar-benar memiliki konten yang sama.

Dalam sebagian besar / banyak situasi ini baik-baik saja, dan membandingkan hash " cukup baik ", tetapi ini tergantung pada model ancaman Anda.

Pada akhirnya, jika Anda perlu meningkatkan level kepastian, maka saya akan merekomendasikan Anda melakukan hal berikut:

  1. Gunakan algoritma hashing yang kuat ( MD5 tidak lagi dianggap memadai jika Anda perlu melindungi terhadap pengguna yang berpotensi jahat)
  2. Gunakan beberapa algoritma hashing
  3. Bandingkan ukuran file - titik data tambahan dapat membantu mengidentifikasi potensi tabrakan, tetapi perhatikan bahwa tabrakan MD5 yang ditunjukkan tidak perlu mengubah panjang data.

Jika Anda perlu 100% yakin, maka mulailah dengan hash, tetapi jika hash cocok, ikuti dengan perbandingan byte-by-byte dari kedua file.


Selain itu, seperti yang ditunjukkan oleh orang lain ... kompleksitas dokumen yang dihasilkan oleh aplikasi seperti Word dan Excel berarti teks, angka, tata letak yang terlihat bisa sama, tetapi data yang disimpan dalam file bisa berbeda.

Excel sangat buruk dalam hal ini - hanya dengan membuka spreadsheet, menyimpannya ( tidak melakukan apa-apa ) dapat menghasilkan file baru, dengan konten yang berbeda.

Attie
sumber
6
MD5 tidak lagi dianggap memadai sangat benar secara kriptografi tetapi untuk memeriksa keunikan (dengan tidak adanya kedengkian, misalnya jika Anda mengontrol input) itu bagus dan cepat (dan 128 bit harus banyak)
Chris H
4
" ikuti dengan perbandingan byte-by-byte dari kedua file. " Jika Anda akan melakukan perbandingan file, Anda sebaiknya melakukannya terlebih dahulu ... tidak ada gunanya membaca semua file untuk menghitungnya hash hanya untuk membaca kembali kedua file untuk membandingkannya!
TripeHound
3
@ TripeHound Tergantung apakah file-file tersebut bersifat lokal atau tidak ... jika Anda sudah memiliki hash satu dan memperkenalkan file baru ke sistem, apakah file baru tersebut membutuhkan hash yang disimpan dalam database tetap, dll ... Lakukan panggilan yang sesuai dengan situasi Anda.
Attie
5
Tidak, ini bukan permainan probabilitas. Anda salah memperkirakan betapa tidak mungkinnya tabrakan tidak disengaja itu. Itu tidak akan terjadi. Membalik sedikit selama perbandingan lebih mungkin terjadi. Di sisi lain, dalam beberapa skenario, tabrakan yang disengaja mungkin terjadi, dan itu sama sekali bukan permainan yang memungkinkan.
Gilles 'SANGAT berhenti menjadi jahat'
3
@ MBrig: Hash 32-bit akan memiliki risiko signifikan ketidakcocokan disengaja. Akan menjadi 128 atau 256 bit, bagaimanapun, membuat perbedaan besar . Dengan 128 bit, satu miliar monyet, masing-masing mengetik satu miliar dokumen yang benar-benar berukuran acak akan memiliki peluang 0,3% untuk menciptakan dua dokumen dengan hash yang sama. Dengan 256 bit, bahkan jika miliaran monyet bisa mengetik satu miliar dokumen acak berukuran per detik selama satu miliar tahun, kemungkinan salah satu dari milyaran dokumen yang memiliki nilai hash yang secara kebetulan cocok akan semakin kecil.
supercat
6

Jika dua file memiliki hash MD5 yang sama, dan keduanya belum dibuat secara khusus, maka keduanya identik. Betapa sulitnya untuk membuat file dengan hash MD5 yang sama tergantung pada format file, saya tidak tahu betapa mudahnya dengan file Excel.

Jadi, jika Anda memiliki file Anda sendiri yang hanya berbaring dan ingin mencari duplikat, MD5 aman. Jika Anda menulis salah satu file, dan file lainnya asal meragukan, MD5 masih aman (satu-satunya cara untuk mendapatkan file yang berbeda dengan MD5 checksum yang sama adalah dengan membuat kedua file). Jika seseorang yang Anda tidak percaya mengirimi Anda proposal anggaran, dan kemudian mengirimkan file lain yang mereka klaim adalah sama, maka MD5 mungkin tidak cukup.

Untuk menghindari risiko apa pun, gunakan SHA-256 atau SHA-512 alih-alih MD5. Jika dua file memiliki hash SHA-256 yang sama, maka mereka identik. Hal yang sama berlaku untuk SHA-512. (Ada kemungkinan teoretis bahwa mereka bisa berbeda, tetapi kemungkinan ini terjadi secara tidak sengaja jauh lebih kecil daripada kemungkinan komputer Anda membalik sedikit selama verifikasi daripada yang tidak relevan. Adapun seseorang dengan sengaja membuat dua file dengan hash yang sama, tidak ada yang tahu bagaimana melakukan ini untuk SHA-256 atau SHA-512.)

Jika dua file Excel memiliki hash yang berbeda, maka mereka berbeda, tetapi tidak ada cara untuk mengetahui seberapa besar perbedaannya. Mereka dapat memiliki data yang identik tetapi pemformatan yang berbeda, atau mereka bisa saja berbeda di properti, atau mereka mungkin telah disimpan oleh versi yang berbeda. Bahkan jika Excel mirip Word, maka hanya menyimpan file memperbarui metadata-nya. Jika Anda hanya ingin membandingkan data numerik dan teks dan mengabaikan pemformatan dan properti, Anda dapat mengekspor spreadsheet ke CSV untuk membandingkannya.

Jika Anda memiliki alat Unix / Linux yang tersedia, maka Anda dapat menggunakan cmpuntuk membandingkan dua file. Untuk membandingkan dua file pada mesin yang sama, checksum hanya membuat segalanya lebih rumit.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Jika dua file memiliki hash MD5 yang sama, dan keduanya belum dibuat secara khusus, maka keduanya identik. Itu tidak benar. Ada banyak kemungkinan pesan, namun hanya ada 2 ^ 64 hash 64-bit yang mungkin. Ini disebut "prinsip pigeonhole" : "prinsip pigeonhole menyatakan bahwa jika nitem dimasukkan ke dalam mwadah, dengan n > m, maka setidaknya satu kontainer harus mengandung lebih dari satu item." Jika Anda membuat lebih dari 2 ^ 64 pesan Anda akan mengalami tabrakan tanpa "kerajinan khusus". Dan Anda mungkin hanya dengan 2.
Andrew Henle
@AndrewHenle, MD5 bukan 64 bit, ini 128 bit. Jika menghasilkan tabrakan yang tidak disengaja membawa kita ke rentang waktu panas-kematian-alam semesta, "mungkin" hanya untuk definisi yang sangat akademis (karenanya tidak berguna) daripadanya.
Charles Duffy
@CharlesDuffy Anda menganggap hash didistribusikan secara acak. Ini bukan.
Andrew Henle
Menjadi setara secara efektif dengan distribusi acak adalah bagian dari definisi apa yang merupakan hash kriptografi yang baik - Anda memiliki banyak putaran pencampuran karena suatu alasan. Tentu saja, ada algoritma hash yang lemah, tetapi berfokus pada kelemahan itu membawa kita ke peringatan sebelumnya yang disebutkan di sekitar serangan yang disengaja. (Atau apakah Anda mengatakan bahwa MD5 telah terbukti hanya memiliki 64 bit yang secara acak acak? Saya akui bahwa saya belum mengikuti, jadi masuk akal - tolong tautannya?)
Charles Duffy
@AndrewHenle Saya tidak menyatakan bahwa tabrakan secara matematis tidak mungkin, yang akan salah, tetapi tidak relevan di sini. Saya menyatakan bahwa itu belum terjadi, yang benar. Komentar Anda salah dengan cara yang sepenuhnya mengubah kesepakatan. Ada 2 ^ 128 hash MD5 yang mungkin, bukan 2 ^ 64. Ini berarti Anda harus menghasilkan 2 ^ 128 hash untuk memastikan untuk menghasilkan tabrakan. Sebenarnya, dengan paradoks ulang tahun, 2 ^ 64 akan memberi Anda kesempatan makroskopis dari tabrakan antara hash yang Anda hasilkan (bukan dengan hash yang dihasilkan sebelumnya). Tapi ini bisa diperdebatkan karena kita tahu cara membuat tabrakan.
Gilles 'SO- berhenti menjadi jahat'
6

Jawaban singkat: Sebuah hash kriptografi seharusnya untuk membantu Anda menjadi cukup yakin bahwa file dengan hash yang cocok adalah sama. Kecuali sengaja dibuat, kemungkinan dua file yang sedikit berbeda memiliki nilai hash yang serupa sangat kecil. Tetapi ketika datang untuk membandingkan dan memverifikasi file yang bisa dengan sengaja dirusak, MD5 adalah pilihan yang buruk. (Gunakan fungsi hash lain seperti SHA3 atau BLAKE2.)

Jawaban panjang: Fungsi hash yang ideal adalah hash yang menciptakan hash kriptografis yang hampir unik untuk setiap bagian data yang unik. Dengan kata lain, kita pasti tahu bahwa ada dua file di alam semesta ini yang nilai hashnya bertabrakan, kemungkinan kedua file ini secara alami bersatu adalah sangat kecil.

Sepuluh tahun yang lalu, saya memutuskan untuk tetap tinggal sejauh mungkin dari MD5. (Tentu saja, sampai kemarin, saya ingat alasan yang salah untuk melakukannya; sepuluh tahun adalah waktu yang lama, Anda lihat. Saya meninjau kembali memo masa lalu saya untuk mengingat mengapa dan mengedit jawaban ini.) Anda lihat, pada tahun 1996, MD5 ditemukan rentan terhadap serangan tabrakan. 9 tahun kemudian, para peneliti dapat membuat pasangan dokumen PostScript dan (ouch!) Sertifikat X.509 dengan hash yang sama! MD5 jelas rusak. (Megaupload.com juga menggunakan MD5, dan ada banyak saputangan di sekitar tabrakan hash yang memberi saya masalah pada saat itu.)

Jadi, saya menyimpulkan bahwa sementara MD5 (dan masih) dapat diandalkan untuk membandingkan file yang tidak berbahaya, kita harus berhenti menggunakannya sama sekali. Saya beralasan bahwa mengandalkannya memiliki risiko berubah menjadi indulgensi dan keyakinan salah: Setelah Anda mulai membandingkan file menggunakan hash MD5 mereka, suatu hari Anda lupa cetak finep keamanan dan membandingkan dua file yang sengaja dibuat untuk memiliki hash yang sama. Selain itu, CPU dan cryptoprocessor tidak mungkin menambahkan dukungan untuk itu.

Poster asli, bagaimanapun, memiliki alasan lebih sedikit untuk menggunakan MD5, karena:

  1. Selama seseorang membandingkan dua file saja, perbandingan byte-untuk-byte sebenarnya lebih cepat daripada menghasilkan hash MD5 sendiri. Untuk membandingkan tiga atau lebih file ... yah, sekarang Anda memiliki alasan yang sah.
  2. OP menetapkan "cara untuk meninjau ini dan tanpa menginstal banyak plugin". Perintah Get-FileHash Windows PowerShell dapat menghasilkan hash SHA1, SHA256, SHA384, SHA512 dan MD5. Pada komputer modern dengan dukungan perangkat keras untuk fungsi hash SHA, menghasilkannya lebih cepat.

sumber
6
Anda dapat membuat fungsi hash kriptografis Anda sendiri dengan panjang berapa pun yang Anda pilih, true; tetapi kemudian ia memiliki panjang yang tetap dan prinsip pigeonhole tetap berlaku. Jawaban umum adalah: "dengan membandingkan hash mereka saja, Anda tidak dapat memastikan kedua file itu identik".
Kamil Maciorowski
2
@KamilMaciorowski Secara teori, ya saya bisa. Fungsi hash custom-made saya hanya dapat menghasilkan salinan file terbesar. Tetapi saya tidak tertarik membahas hal ini lebih jauh; kebenarannya adalah, Anda diturunkan karena alasan yang membuat nitpicking hanya untuk membuktikan bahwa Anda lebih cerdas dan itu menjadi bumerang bagi Anda. Sekarang Anda tidak dapat mengambil kembali.
Saya setuju dengan @KamilMaciorowski ... Ini adalah game probabilitas ... menggunakan hash tunggal, Anda bisa " cukup percaya diri " bahwa file dengan hash yang cocok adalah sama, tetapi tidak ada jaminan 100%. Menggunakan algoritma yang lebih baik, atau menggunakan banyak algoritma dapat meningkatkan kepercayaan diri Anda - bahkan membandingkan ukuran file dapat membantu ... tetapi Anda tidak akan pernah bisa 100% percaya diri tanpa memeriksa byte-for-byte.
Attie
1
@ Attie Huh! Itulah yang awalnya saya maksudkan. Terima kasih. 🙏 Hanya saya yang tidak terbiasa dengan frasa seperti "Anda bisa cukup percaya diri". Maaf. 😜 Tetap saja, itu sebabnya kami memiliki tombol edit. Saya pribadi tidak akan pernah membuang jawaban yang baik hanya karena satu kata di dalamnya salah. Saya mengeditnya.
1
Tentang "trashing a good answer": harap dicatat saya memastikan terlebih dahulu bahwa itu bukan kesalahan ketik dan Anda benar-benar serius; kemudian diturunkan dan pada saat yang sama saya memberi Anda umpan balik, mengungkapkan alasan saya dengan harapan jawaban Anda akan menjadi lebih baik. Ya, jadi downvote saya tidak lebih. Pada dasarnya saya katakan kepada Anda apa yang saya pikir salah dengan jawaban Anda, Attie membantu untuk memperjelas, Anda meningkatkan jawabannya. Dari sudut pandang saya, kami semua menangani situasi ini dengan benar dan keseluruhan cerita menjadi sangat baik. Terima kasih.
Kamil Maciorowski
5

Saya memiliki 2 dokumen excel dan saya ingin memeriksa apakah keduanya persis sama, terlepas dari nama file.

Dari perspektif praktis, langsung membandingkan file untuk mengetahui apakah mereka berbeda akan lebih cepat daripada menghitung hash untuk setiap file dan kemudian membandingkan hash itu.

Untuk menghitung hash Anda harus membaca keseluruhan isi kedua file.

Untuk menentukan apakah mereka identik melalui perbandingan langsung, Anda hanya perlu membaca konten dari kedua file sampai mereka tidak cocok. Setelah Anda menemukan perbedaan, Anda tahu file tidak identik dan Anda tidak perlu membaca lebih banyak data dari kedua file.

Dan sebelum Anda melakukan keduanya, Anda dapat membandingkan ukuran kedua file tersebut. jika ukurannya berbeda maka isinya tidak bisa sama.

Andrew Henle
sumber
Saat menggunakan dua file pada satu drive fisik, menggunakan fungsi hash yang dapat mengikuti kecepatan I / O pada setiap file secara terpisah mungkin sedikit lebih cepat daripada membandingkan file, karena tidak perlu beralih antara membaca dua file. Tempat hash benar-benar bersinar, adalah ketika mencoba melakukan perbandingan yang melibatkan banyak file yang terlalu besar untuk muat dalam memori. Bahkan jika Anda hanya ingin mengetahui apakah mereka semua cocok, membandingkan file 1 ke file 2, maka file 1 ke file 3, maka file 1 ke file 4, dll. Mungkin hampir dua kali lebih lambat dari komputasi semua hash mereka.
supercat
@supercat Jika file dibaca dalam potongan lebih besar dari MB atau lebih, pergantian file tidak akan terlihat. Dan jika alur kerja melibatkan membandingkan banyak file untuk menemukan duplikat, hash mungkin juga dihitung saat setiap file ditulis - karena melakukannya maka dapat dilakukan secara gratis.
Andrew Henle
Jika seseorang memiliki cukup ruang untuk buffer potongan file besar, waktu beralih tidak perlu menjadi masalah, tetapi sebaliknya mereka mungkin. Adapun menghitung hash ketika file ditulis, itu mungkin baik jika seseorang dapat menjamin bahwa file tidak dapat dimodifikasi tanpa mengubah atau setidaknya membatalkan hash yang disimpan. Jika seseorang mencoba untuk menghindari membuat cadangan file secara berlebihan, hanya dengan melihat nilai hash yang disimpan dapat menyebabkan seseorang untuk membuat cadangan file yang rusak secara tidak sengaja tetapi tidak perlu membuat cadangan file yang tidak rusak dimana file yang rusak seharusnya cocok tetapi tidak .
supercat
"Setelah Anda menemukan perbedaan, Anda tahu file tidak identik" - belum tentu. File XLSX adalah file ZIP yang berpotensi dapat menyimpan konten dalam urutan yang berbeda masih memiliki konten yang sama. Tetapi bahkan jika Anda mendekompres mereka dan membandingkan setiap file individual, file XLSX berisi dokumen XML yang mungkin memiliki akhiran baris yang berbeda tanpa mempengaruhi konten.
Thomas Weller
5

Hash seperti MD5 atau SHA memiliki panjang tetap, misalkan 300 karakter alfanumerik (pada kenyataannya mereka lebih pendek dan tidak menggunakan seluruh rangkaian karakter alfanumerik).

Katakanlah file dibuat dari karakter alfanumerik dan berukuran hingga 2GB.

Anda dapat dengan mudah melihat bahwa ada lebih banyak file (dengan ukuran hingga 2GB) daripada nilai hash yang mungkin. Prinsip pigeonhole mengatakan bahwa beberapa file (berbeda) harus memiliki nilai hash yang sama.

Juga, seperti yang ditunjukkan pada shattered.io 1 Anda dapat memiliki dua file berbeda: shattered.io/static/shattered-1.pdf dan shattered.io/static/shattered-2.pdf yang memiliki nilai hash SHA-1 yang sama saat menjadi benar-benar berbeda.

1 SHA1 adalah algoritma hashing "lebih kuat" dari md5

styrofoam terbang
sumber
Kemungkinan tabrakan tidak disengaja terlalu rendah untuk diperhitungkan. Risiko tabrakan yang disengaja ada untuk MD5 juga dan lebih buruk daripada untuk SHA-1 yang tidak terlalu relevan di sini.
Gilles 'SANGAT berhenti menjadi jahat'
4

TIDAK. Nilai berbeda menjamin file berbeda. Nilai yang sama bukan jaminan file-nya sama. Relatif mudah untuk menemukan contoh menggunakan CRC16.

Pada keseimbangan probabilitas dengan skema hashing kontemporer mereka sama.

mckenzm
sumber
1
Pertanyaannya adalah tentang MD5, yang tidak memiliki risiko tabrakan tidak disengaja. Memang ada risiko tabrakan yang disengaja, tapi itu bukan masalah probabilitas.
Gilles 'SANGAT berhenti menjadi jahat'
1
Ini juga tentang excel spreadsheet dengan nama yang berbeda, seberapa besar mereka menjadi byte untuk perbandingan byte tidak bisa menjadi pilihan? Dua skema hashing bersama akan memberikan kepastian.
mckenzm
2
@Gilles Semua kode hash memiliki risiko tabrakan yang tidak disengaja, menurut definisi. Satu-satunya jalan keluar adalah menggunakan seluruh file sebagai kode hash. Komentar Anda tidak masuk akal.
user207421
3

Pertanyaan Anda mundur, mari kita asumsikan bahwa hash berarti mereka memiliki data yang sama (yang tidak dijamin 100%, tetapi cukup baik untuk seumur hidup membandingkan file setiap detik untuk tidak mengenai tabrakan). Itu tidak selalu berarti memiliki data yang sama berarti mereka akan memiliki hash yang sama. Jadi tidak - Anda tidak dapat membandingkan data dalam file excel dengan data di file excel lain dengan hashing file karena ada banyak cara dua file dapat berbeda tanpa data yang mendasarinya berbeda. Satu cara yang jelas - data disimpan sebagai XML, setiap sel memiliki simpul XML sendiri. Jika node tersebut disimpan dalam urutan yang berbeda maka datanya sama tetapi file berbeda.

David Rice
sumber
3

Untuk menambahkan jawaban lain, berikut adalah banyak contoh pasangan file dengan hash MD5 yang sama dan konten yang berbeda.

Giulio Muscarello
sumber
Jawaban yang cukup hanya tautan, tetapi menarik.
Thomas Weller
2

Jawaban untuk OP ini telah diberikan tetapi mungkin mendapat manfaat dari ringkasan.

Jika Anda ingin memeriksa apakah dua file sama, banyak tergantung pada apakah file dan hash berada di bawah kendali Anda.

Jika Anda menghasilkan hash sendiri dari file, dan Anda cukup yakin tidak ada orang lain yang memiliki kesempatan / keterampilan / motivasi untuk secara sengaja mencoba dan membuat Anda mencapai kesimpulan yang salah, maka hampir semua hash - bahkan hash yang "diketahui rusak" seperti MD5 dan SHA1 adalah hampir pasti cukup. Tapi itu, maksud saya Anda bisa menghasilkan file dengan kecepatan tinggi selama jutaan tahun dan Anda masih tidak akan berakhir dengan dua file yang sebenarnya berbeda tetapi memiliki hash yang sama. Hampir pasti aman.

Ini adalah skenario yang Anda miliki, ketika Anda ingin dengan cepat memeriksa apakah dua direktori pada PC atau server file Anda memiliki konten yang sama, jika ada file dalam direktori yang merupakan duplikat yang tepat, dll, dan Anda cukup yakin file tersebut belum telah direkayasa / dimodifikasi secara ilegal, dan Anda memercayai aplikasi / utilitas hashing Anda untuk memberikan hasil yang benar.

Jika Anda berada dalam skenario di mana salah satu file - atau hash yang dihitung sebelumnya - mungkin telah dimanipulasi atau direkayasa untuk menipu Anda ke kesimpulan yang salah, maka Anda memerlukan hash yang lebih kuat (tidak terputus), dan / atau keamanan lainnya. Misalnya, jika Anda mengunduh file dan memeriksa apakah itu valid dengan memeriksa hash, maka penyerang mungkin dapat merekayasa file buruk dengan hash yang benar, atau menyerang situs web untuk menempatkan hash yang salah ketika Anda mencari "kanan" " (nilai yang diharapkan. Ini berujung pada masalah keamanan yang lebih luas.

Stilez
sumber
2

Pada baris perintah Windows, Anda dapat menggunakan computilitas untuk menentukan apakah dua file persis sama. Sebagai contoh:

comp fileone.xls filetwo.xls
Chad
sumber
1

Ketika hash identik, apakah ini berarti bahwa isi file 1: 1 sama?

Tidak Jika hash yang berbeda, itu tidak berarti bahwa isi berbeda. Kode hash yang sama tidak menyiratkan konten yang sama. Kode hash adalah pengurangan domain besar ke rentang yang lebih kecil, menurut definisi: implikasinya adalah kode hash atas konten yang tidak setara dapat sama. Kalau tidak, tidak akan ada gunanya menghitungnya.

pengguna207421
sumber
Kalau tidak, tidak akan ada gunanya menghitungnya. Jika Anda telah melanggar hukum matematika dan menemukan fungsi kompresi lossless yang dapat mengompresi data acak, melanggar prinsip pigeonhole, akan sangat berharga untuk menggunakannya! Ini akan menjadi sangat nyaman jika 128-bit hash tidak mewakili unik seluruh isi file. Bahkan jika tidak ada fungsi dekompresi untuk mengubah hash kembali ke file hash bebas-kemungkinan yang secara matematis-mustahil akan menyenangkan untuk dimiliki, misalnya untuk mempercepat pencarian dup pada data yang tidak dipercaya seperti pada gambar VM.
Peter Cordes
"Jika hash berbeda, artinya kontennya berbeda." Belum tentu. File XLSX adalah file ZIP dan dimungkinkan untuk memiliki konten yang sama disimpan dalam urutan file yang berbeda.
Thomas Weller
1

Jawaban ini dimaksudkan sebagai peta skenario berguna yang dapat atau tidak dapat terjadi, dan alasan yang dapat Anda terapkan. Lihat jawaban lain untuk mempelajari mengapa fungsi hash bekerja seperti ini.


Setelah Anda memilih fungsi hash dan tetap menggunakannya, ini semua kombinasi untuk dipertimbangkan:

          |    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

Skenario di mana file identik menghasilkan nilai hash yang berbeda adalah satu-satunya yang benar-benar mustahil.


Dua alasan yang selalu berlaku:

  • Jika file identik maka nilai hash identik pasti .
  • Jika nilai hash berbeda maka file berbeda pasti .

Dua alasan yang tidak ketat :

  • Jika file berbeda maka nilai hash mungkin berbeda.
  • Jika nilai hash identik maka file mungkin identik.
Kamil Maciorowski
sumber
0

Untuk keperluan Anda, ya, hash identik berarti file yang identik.

Sebagai jawaban lain menjelaskan, dimungkinkan untuk membangun 2 file berbeda yang menghasilkan hash yang sama dan MD5 tidak terlalu kuat dalam hal ini.

Jadi gunakan algoritma hashing yang lebih kuat jika Anda berencana membandingkan sejumlah besar dokumen excel atau jika Anda berpikir seseorang mungkin ingin memanipulasi perbandingan. SHA1 lebih baik dari MD5. SHA256 lebih baik lagi dan akan memberi Anda kepercayaan penuh untuk penggunaan khusus Anda.

jah
sumber
-1

File-file tersebut mungkin identik jika hash-nya identik. Anda dapat meningkatkan kepercayaan diri dengan memodifikasi kedua file dengan cara yang identik (misalnya, menempatkan nilai yang sama di sel yang tidak digunakan yang sama) lalu membandingkan hash dari file yang dimodifikasi. Sulit untuk membuat tabrakan yang disengaja untuk file yang diubah dengan cara yang tidak diketahui sebelumnya.

ibft2
sumber
Ini tidak akan berfungsi karena data tambahan yang disimpan dalam file kantor. Anda perlu misalnya meletakkan kursor di sel yang sama sebelum menyimpan, menyimpan pada waktu yang tepat dll. Tetapi bahkan kemudian, file XLSX adalah file zip secara internal, jadi jika algoritma itu menyimpan file individu dalam urutan yang berbeda (untuk tujuan apa pun), file tersebut identik tetapi hash tidak
Thomas Weller
-2

Mari kita lihat ini dengan cara yang praktis. Alih-alih mengatakan "hash adalah identik" Saya akan mengatakan "Saya menulis sebuah program komputer yang menghitung hash dari dua file dan mencetak apakah mereka sama atau tidak", dan saya menjalankan program dengan dua file, dan ia mengatakan "identik". Ada beberapa alasan mengapa itu bisa terjadi:

File mungkin identik. Kode saya mungkin memiliki bug (salah satu yang sebenarnya terjadi dalam praktek adalah membandingkan dua hash panjang (256 byte) tidak dengan memcmp tetapi dengan strcmp: Perbandingan akan mengembalikan "sama" jika byte pertama di setiap hash adalah nol, dan peluang untuk itu adalah 1 dalam 65536. Mungkin ada kesalahan perangkat keras (sinar kosmik memukul sel memori dan beralih). Atau Anda mungkin memiliki kasus langka dua file berbeda dengan hash identik (tabrakan hash).

Saya akan mengatakan bahwa untuk file yang tidak identik, sejauh ini penyebab yang paling mungkin adalah kesalahan programmer, kemudian muncul sinar kosmik yang mengubah variabel boolean dengan hasil membandingkan hash dari "false" menjadi "true", dan kemudian muncul kebetulan tabrakan hash.

Ada sistem cadangan perusahaan yang menghindari membuat cadangan file identik dari 10.000 pengguna dengan hashing setiap file dan memeriksa file dengan hash identik yang sudah disimpan di server. Jadi dalam kasus tabrakan file tidak akan didukung, mungkin menyebabkan kehilangan data. Seseorang menghitung bahwa kemungkinan besar meteorit mengenai server Anda dan menghancurkan semua cadangan daripada kehilangan file karena checksumenya cocok dengan file yang berbeda.

gnasher729
sumber