Apakah MD5 masih cukup baik untuk mengidentifikasi file secara unik?

142

Apakah hashing MD5 file masih dianggap sebagai metode yang cukup baik untuk mengidentifikasinya secara unik mengingat semua gangguan algoritma MD5 dan masalah keamanan dll? Keamanan bukanlah perhatian utama saya di sini, tetapi mengidentifikasi setiap file secara unik.

Ada pemikiran?

Ranhiru Jude Cooray
sumber
2
Saya sebenarnya sedang menggunakannya sendiri di salah satu aplikasi saya, dan sejauh yang saya tahu itu cukup baik untuk mengidentifikasi file secara unik.
Tidak Tersedia
2
Anda mungkin akan menemukan pertanyaan ini: stackoverflow.com/questions/862346/… berguna.
gigi tajam
Berapa banyak file yang perlu Anda identifikasi? Ini menghasilkan 128bits, jadi jika Anda mencoba mengidentifikasi beberapa ribu file, tidak apa-apa. Tetapi jika Anda mencoba untuk mengidentifikasi lebih dari itu, Anda mungkin akan mengalami benturan / paradoks ulang tahun.
Marcin
Mereka akan menjadi file gambar, jpg, png dan gif. Dan ya saya pikir batasnya adalah beberapa ribu ... Tapi berapa banyak file yang menurut Anda secara kasar akan menyebabkan masalah bagi saya?
Ranhiru Jude Cooray

Jawaban:

89

Iya. MD5 telah sepenuhnya rusak dari perspektif keamanan, tetapi kemungkinan tabrakan yang tidak disengaja masih sangat kecil. Pastikan saja bahwa file tersebut tidak dibuat oleh seseorang yang tidak Anda percayai dan mungkin memiliki niat jahat.

Marcelo Cantos
sumber
2
@none: Untuk pertanyaan pertama Anda, lihat di sini . Saya khawatir saya tidak mengerti pertanyaan lainnya.
Marcelo Cantos
9
@ 0xA3: Baik Anda maupun saya tidak tahu file apa yang dimaksud OP, atau seberapa besar kerusakan yang akan ditimbulkan oleh kompromi. Bisa jadi koleksi foto bayi anak mereka sepanjang yang kita tahu. Tujuan saya adalah memberikan fakta; apa yang dilakukan orang lain dengan mereka adalah urusan mereka. Juga pertimbangkan bahwa Bruce Schneier merekomendasikan untuk menuliskan kata sandi Anda; tidak semuanya perlu disimpan di Fort Knox. Beberapa hal akan baik-baik saja di bawah pot bunga.
Marcelo Cantos
3
@Marcelo Cantos, menurut saya yang kurang di sini adalah diferensiasi atau pembongkaran istilah 'keamanan'. Jelas orang mengasumsikan 'keamanan' untuk setiap penggunaan pekerjaan checksum, tetapi nomenklatur yang mungkin dimaksud Marcelo adalah 'di laboratorium'.
hpavc
5
Saya sangat tidak setuju. Nilai hash yang berbeda memberi tahu bahwa file tersebut berbeda. Tetapi untuk nilai hash yang sama: Anda tidak dapat mengatakan "sangat mungkin keduanya sama" jika hashnya sama: Anda hanya dapat membandingkan byte-untuk-byte. Hash adalah banyak urutan besarnya lebih kecil daripada jumlah nilai yang berbeda untuk seluruh file, jadi ada banyak, banyak, banyak kemungkinan benturan untuk setiap nilai hash. Hanya jika Anda dalam kasus menyalin file yang dikenal (dengan hash yang diketahui), nilai hash yang identik "mungkin berarti" yang ke-2 disalin dengan benar (meskipun demikian, itu tidak 100% yakin, tetapi sangat mungkin).
Olivier Dulac
3
Oke, matematikaku payah. GUID memiliki sekitar 122 bit entropi, sehingga kemungkinan tabrakan di mana pun dalam satu miliar file adalah sekitar 2 ^ (2 * 30 - 122) = 2 ^ -62. Meskipun ini jauh lebih tinggi dari kalkulasi awal saya, ini masih sangat kecil, kira-kira satu dari 4 triliun.
Marcelo Cantos
32

Untuk tujuan praktis, hash yang dibuat mungkin acak, tetapi secara teoritis selalu ada kemungkinan tabrakan, karena prinsip Pigeonhole . Memiliki hash yang berbeda tentu berarti file tersebut berbeda, tetapi mendapatkan hash yang sama tidak berarti bahwa file tersebut identik.

Menggunakan fungsi hash untuk tujuan itu - tidak peduli apakah keamanan menjadi perhatian atau tidak - oleh karena itu harus selalu menjadi langkah pertama pemeriksaan, terutama jika algoritma hash diketahui dengan mudah membuat benturan. Untuk mengetahui secara andal apakah dua file dengan hash yang sama berbeda, Anda harus membandingkan file tersebut byte-by-byte.

stapeluberlauf
sumber
16
@Ranhir. Tidak. Hash memberi Anda nilai 'ringkasan' yang (untuk MD5) hanya sepanjang 16 byte. Untuk menjamin bahwa file-file tersebut identik, Anda perlu melakukan pemeriksaan byte demi byte. Ini benar, apa pun algoritma hash yang Anda pilih, selalu ada kemungkinan tabrakan.
PaulG
6
@Ranhir. Baca kembali jawaban ini, yang paling komprehensif di sini. Hashing dapat digunakan sebagai langkah pertama, yang memberi Anda 99,99 ^ e% kepastian bahwa file-file tersebut identik, tetapi jika Anda ingin benar - benar yakin 100% , maka Anda harus melakukan pemeriksaan byte demi byte. Ini benar apakah Anda menggunakan MD5, SHA atau algoritma lainnya.
PaulG
7
Jawaban ini salah. Pencegahan perusakan dan verifikasi keunikan adalah hal yang sama. Selain itu, meskipun hashing tidak menjamin keunikan, begitu pula perbandingan sebenarnya. Faktanya, kemungkinan hash bertabrakan secara tidak sengaja sebenarnya lebih rendah daripada kemungkinan perbandingan gagal karena gangguan pada CPU yang dihasilkan oleh emisi sinar gamma matahari normal. Dan jangan lupa bahwa seringkali satu-satunya sumber file berada di sisi lain dunia di dalam server web, dan satu-satunya informasi independen yang Anda miliki untuk tujuan perbandingan adalah hash.
Marcelo Cantos
8
@Tokopedia Ini tidak sesuai dengan alasan logis bahwa tabrakan yang tidak disengaja lebih kecil kemungkinannya daripada pembalikan bit yang tidak disengaja (sambil membuat perbandingan byte dengan byte). Anda masih memiliki peluang bit flips yang sama saat membuat hash (dan bisa dibilang lebih karena lebih banyak waktu pemrosesan yang terlibat). @Thomas mengangkat poin awalnya untuk menyarankan bahwa tidak ada cara yang dijamin untuk mengidentifikasi keunikan, meskipun dampak dari bit flips sangat bisa diperdebatkan. Perkiraan paling pesimis adalah 1 flip per GB / jam, dan ECC RAM akan menghapusnya.
PaulG
2
"kemungkinan hash bertabrakan secara tidak sengaja sebenarnya lebih rendah daripada kemungkinan perbandingan gagal karena gangguan di CPU yang dihasilkan oleh emisi sinar gamma matahari normal" [rujukan?]
endolith
20

MD5 akan cukup baik jika Anda tidak memiliki musuh. Namun, seseorang dapat (dengan sengaja) membuat dua file berbeda yang memiliki nilai hash yang sama (disebut tabrakan), dan ini mungkin atau mungkin bukan masalah, bergantung pada situasi Anda yang sebenarnya.

Karena mengetahui apakah kelemahan MD5 yang diketahui berlaku untuk konteks tertentu adalah masalah kecil, disarankan untuk tidak menggunakan MD5. Menggunakan fungsi hash tahan benturan (SHA-256 atau SHA-512) adalah jawaban yang aman. Juga, menggunakan MD5 adalah hubungan masyarakat yang buruk (jika Anda menggunakan MD5, bersiaplah untuk membenarkan diri Anda sendiri; sedangkan tidak ada yang akan mempertanyakan Anda menggunakan SHA-256).

Thomas Pornin
sumber
2
Jawaban ini mungkin sedikit menyesatkan jika pembaca tidak terlalu paham dengan hashing. Tidak ada yang ajaib tentang SHA yang mencegah tabrakan hash, mereka hanya lebih tahan terhadap serangan tabrakan hash . Jika Anda ingin memastikan lebih dari 99,999 ^ e% bahwa file identik, Anda masih memerlukan pemeriksaan byte demi byte.
PaulG
7
Sebenarnya perbandingan byte-ke-byte mungkin gagal karena sinar kosmik membalik sedikit (misalnya mengubah a return 0;menjadi a return 1;). Ini sangat tidak mungkin, tetapi risiko tabrakan dengan SHA-256 bahkan lebih kecil dari itu. Secara matematis, Anda tidak dapat memastikan bahwa dua file yang memiliki nilai yang sama identik, tetapi Anda tidak dapat memastikannya dengan membandingkan file itu sendiri, selama Anda menggunakan komputer untuk perbandingan. Yang saya maksud adalah bahwa tidak ada artinya melampaui beberapa 99,999 .... 9% kepastian, dan SHA-256 sudah memberikan lebih dari itu.
Thomas Pornin
2
Apa, Anda tidak menggunakan memori ECC? ;). Komentar bagus, pemikiran yang sangat menarik.
PaulG
1
Jangan lupakan topi kertas timah! Lebih serius lagi, bagaimana Anda mengetahui fakta-fakta tentang tabrakan ini dan apakah Anda telah memverifikasi ini dengan cara tertentu?
James P.
@ThomasPornin Kebalikan bit sinar kosmik juga akan memengaruhi metode MD5, jadi masih lebih buruk.
endolith
9

Sebuah md5 dapat menghasilkan tabrakan. Secara teoritis, meskipun sangat tidak mungkin, satu juta file berturut-turut dapat menghasilkan hash yang sama. Jangan menguji keberuntungan Anda dan memeriksa tabrakan md5 sebelum menyimpan nilainya.

Saya pribadi suka membuat md5 string acak, yang mengurangi overhead hashing file besar. Ketika tabrakan ditemukan, saya mengulangi dan hash ulang dengan penghitung loop yang ditambahkan.

Anda bisa membaca tentang prinsip pigeonhole .

afilina
sumber
6

Saya tidak akan merekomendasikannya. Jika aplikasi akan bekerja pada sistem multi-pengguna, mungkin ada pengguna, yang akan memiliki dua file dengan hash md5 yang sama (dia mungkin insinyur dan bermain dengan file seperti itu, atau hanya ingin tahu - mereka dapat diunduh dengan mudah dari http: / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html , saya sendiri saat menulis jawaban ini mengunduh dua sampel). Hal lain adalah, bahwa beberapa aplikasi mungkin menyimpan duplikat seperti itu untuk alasan apa pun (saya tidak yakin, jika ada aplikasi seperti itu tetapi kemungkinan ada).

Jika Anda secara unik mengidentifikasi file yang dihasilkan oleh program Anda, saya akan mengatakan tidak masalah untuk menggunakan MD5. Jika tidak, saya akan merekomendasikan fungsi hash lainnya di mana belum ada tabrakan yang diketahui.

tach
sumber
2

Secara pribadi saya pikir orang menggunakan checksum mentah (pilih metode Anda) dari objek lain untuk bertindak sebagai pengenal unik terlalu banyak ketika mereka benar-benar ingin melakukannya adalah memiliki pengenal unik. Sidik jari pada objek untuk penggunaan ini bukanlah maksudnya dan kemungkinan membutuhkan lebih banyak pemikiran daripada menggunakan uuid atau mekanisme integritas serupa.

hpavc
sumber
0

MD5 rusak, Anda dapat menggunakan SHA1 sebagai gantinya (diterapkan di sebagian besar bahasa)

Guillaume Lebourgeois
sumber
Ini adalah jawaban yang sangat bagus. MD5 tidak dapat diterima untuk kasus penggunaan dalam Hukum dan Akuntansi di Eropa mulai Mei 2018.
Bert Sinnema
@BertSinnema dapatkah Anda mengarahkan saya ke sumber yang menentukan fungsi hash mana yang dapat diterima, dll., Tolong?
berezovskyi
@GregSchmit mungkin karena OP tidak peduli dengan kekuatan kriptografi itu sendiri. Saya memahami pertanyaan sebagai "Saya sudah menggunakan MD5 dalam konteks non-keamanan, apakah saya perlu meluangkan waktu untuk memperbarui kode?" semacam itu. Dan dalam konteks ini jawabannya kemungkinan besar salah dan SHA1 juga telah dipatahkan.
berezovskyi
0

Ketika melakukan hashing pendek (<beberapa K?) String (atau file) seseorang dapat membuat dua kunci hash md5, satu untuk string aktual dan yang kedua untuk kebalikan dari string yang digabungkan dengan string asimetris pendek. Contoh: md5 (reverse (string || '1010')). Menambahkan string ekstra memastikan bahwa file yang terdiri dari serangkaian bit identik menghasilkan dua kunci yang berbeda. Harap dipahami bahwa bahkan di bawah skema ini ada peluang teoretis dari dua kunci hash yang identik untuk string non-identik, tetapi kemungkinannya tampak sangat kecil - sesuatu dalam urutan kuadrat dari probabilitas tabrakan md5 tunggal, dan penghematan waktu bisa menjadi besar bila jumlah file bertambah. Skema yang lebih rumit untuk membuat string kedua juga dapat dipertimbangkan,

Untuk memeriksa tabrakan, seseorang dapat menjalankan pengujian ini untuk mengetahui keunikan kunci hash md5 untuk semua bit_vectors dalam db:

pilih md5 (bit_vector), count (*), bit_and (bit_vector) dari db dengan
grup bit_vector oleh md5 (bit_vector), bit_vector memiliki bit_and (bit_vector) <> bit_vector

marcopolo.dll
sumber
Ide cerdas. Jika seorang "penyerang" membuat file palsu dengan hash md5 yang sama, itu tidak akan membantu kecuali dia mengetahui "salting" Anda, dan membalikkan isinya akan membuat hash yang berbeda. Menggunakan 2 kunci md5 seperti itu akan mengurangi banyak kemungkinan. Jika itu hanya untuk mencegah "serangan" menggunakan garam sebelum menghitung secara lokal sudah cukup.
Wolf5
0

Saya suka menganggap MD5 sebagai indikator kemungkinan saat menyimpan data file dalam jumlah besar.

Jika hashnya sama, saya kemudian tahu saya harus membandingkan file byte demi byte, tetapi itu mungkin hanya terjadi beberapa kali karena alasan yang salah, jika tidak (hash tidak sama) Saya yakin kita sedang berbicara tentang dua file yang berbeda .

Shimmy Weitzhandler
sumber