Berapa banyak elemen acak sebelum MD5 menghasilkan tabrakan?

164

Saya punya perpustakaan gambar di Amazon S3. Untuk setiap gambar, saya md5 URL sumber di server saya ditambah stempel waktu untuk mendapatkan nama file yang unik. Karena S3 tidak dapat memiliki subdirektori, saya perlu menyimpan semua gambar ini dalam satu folder datar.

Apakah saya perlu khawatir tentang tabrakan dalam nilai hash MD5 yang dihasilkan?

Bonus: Berapa banyak file yang bisa saya miliki sebelum saya mulai melihat tabrakan dalam nilai hash yang dihasilkan MD5?

Ben Throop
sumber
2
Jawaban literalnya adalah bahwa file kedua dapat memiliki MD5 yang sama dengan yang pertama. Namun kemungkinannya sangat kecil.
Rick James

Jawaban:

307

Kemungkinan hanya dua hash yang bertabrakan secara tidak sengaja adalah 1/2 128 yaitu 1 dari 340 undecillion 282 decillion 366 nonillion 920 octillion 938 septillion 463 sextillion 463 quintillion 374 quadrillion 607 triliun 431 miliar 761 juta 768 juta 211 ribu 456.

Namun jika Anda menyimpan semua hash maka kemungkinannya sedikit lebih tinggi berkat paradoks ulang tahun . Untuk mendapatkan 50% kemungkinan hash bertabrakan dengan hash lainnya, Anda memerlukan 2 64 hash. Ini berarti bahwa untuk mendapatkan tabrakan, rata-rata, Anda harus hash 6 miliar file per detik selama 100 tahun .

Kornel
sumber
20
"probabilitas tabrakan adalah 1/2 ^ 64" - apa? Probabilitas tabrakan tergantung pada jumlah item yang sudah hash, itu bukan nomor tetap. Bahkan, itu sama dengan persis 1 - sPn/s^n, di mana sukuran ruang pencarian ( 2^128dalam hal ini), dan njumlah item yang di-hash. Apa yang Anda mungkin pikirkan adalah 2^64, yang merupakan perkiraan jumlah item yang Anda perlukan untuk hash MD5 untuk memiliki kemungkinan tabrakan 50%.
BlueRaja - Danny Pflughoeft
19
+1 karena saya selalu ingin tahu cara menghitung melewati 999 triliun lol (dan oh ya jawaban Anda informatif)
Kmeixner
7
Sayangnya, Anda masih belum benar. Anda mengasumsikan bahwa fungsi hash benar-benar acak. Bukan itu. Ini berarti kemungkinan tabrakan lebih tinggi.
Jørgen Fogh
22
JørgenFogh: Dan semua hukum fisika juga "tidak benar". Tingkat pedantisme seperti itu tidak perlu karena tidak mengubah jawaban dengan cara yang berarti.
Kornel
20
Jadi maksudmu ada kesempatan!
vargonian
27

S3 dapat memiliki subdirektori. Masukkan saja "/" pada nama kunci, dan Anda dapat mengakses file seolah-olah mereka berada di direktori yang terpisah. Saya menggunakan ini untuk menyimpan file pengguna di folder terpisah berdasarkan ID pengguna mereka di S3.

Misalnya: "mybucket / users / 1234 / somefile.jpg". Ini tidak persis sama dengan direktori dalam sistem file, tetapi API S3 memiliki beberapa fitur yang membuatnya bekerja hampir sama. Saya dapat memintanya untuk mendaftar semua file yang dimulai dengan "users / 1234 /" dan itu akan menunjukkan kepada saya semua file dalam "direktori" itu.

davr
sumber
7
Ini seharusnya menjadi konten yang saya pikir, karena tidak benar-benar menjawab pertanyaan tentang kemungkinan tabrakan
Ian Clark
18

Jadi tunggu, apakah itu:

md5(filename) + timestamp

atau:

md5(filename + timestamp)

Jika yang pertama, Anda hampir mencapai GUID, dan saya tidak akan mengkhawatirkannya. Jika yang terakhir, maka lihat posting Karg tentang bagaimana Anda akan mengalami tabrakan pada akhirnya.

Ryan
sumber
1
Tolong jelaskan bagaimana memasukkan stempel waktu meningkatkan kemungkinan tabrakan
Brad Thomas
14
@BradThomas: Tidak. Risiko tabrakan MD5 adalah sama apakah itu pada nama file atau kombinasi nama file + timestamp. Namun dalam skenario pertama, Anda harus memiliki tabrakan MD5 dan tabrakan timestamp.
Vincent Hubert
2
Ini masih menyisakan peluang 2 ^ (128 ^ 60) berupa collission dengan dua pengguna per menit. Secara harfiah tidak dapat digunakan.
Berry M.
2
@BradThomas Untuk lebih jelas: md5(filename) + timestampmengurangi risiko tabrakan secara besar-besaran karena Anda harus memiliki tabrakan md5 untuk stempel waktu yang persis sama untuk memiliki tabrakan secara keseluruhan. md5(filename + timestamp)sama dengan md5(filename), dengan asumsi bahwa nama file adalah acak untuk memulai (karena menambahkan lebih banyak keacakan untuk sesuatu yang acak hanya mengubah hasil md5 individu dan masalah ulang tahun masih ada di semua hash md5).
robocat
10

Aturan praktis untuk tabrakan adalah akar kuadrat dari rentang nilai. Ig MD5 sig Anda mungkin panjangnya 128 bit, sehingga Anda akan cenderung melihat tabrakan di atas dan di luar 2 ^ 64 gambar.

Will Dean
sumber
1
Anda mungkin berarti 128 bit, bukan 2 ^ 128. :-)
JesperE
5
en.wikipedia.org/wiki/Birthday_Problem Beberapa informasi lebih lanjut tentang masalah ini.
Georg Schölly
7

Meskipun tabrakan MD5 acak sangat jarang, jika pengguna Anda dapat memberikan file (yang akan disimpan kata demi kata) maka mereka dapat merekayasa tabrakan agar terjadi. Artinya, mereka sengaja dapat membuat dua file dengan MD5sum yang sama tetapi data berbeda. Pastikan aplikasi Anda dapat menangani kasus ini dengan cara yang masuk akal, atau mungkin menggunakan hash yang lebih kuat seperti SHA-256.

omong kosong
sumber
menggunakan garam akan mengatasi masalah rekayasa pengguna, bukan?
StackOverflowed
Tergantung bagaimana garam diterapkan. Itu harus menjadi awalan dari data yang disediakan pengguna, atau lebih baik lagi kunci untuk HMAC. Mungkin masih merupakan ide yang bagus untuk berlatih pertahanan secara mendalam.
bdonlan
Catatan meskipun SHA256 memiliki panjang 256 bit, Anda dapat menukar risiko tabrakan dengan panjang kunci yang Anda simpan dengan memotong SHA256 ke bit yang lebih sedikit misalnya menggunakan SHA256 tetapi memotongnya menjadi 128 bit (yang lebih aman daripada menggunakan MD5 bahkan meskipun mereka memiliki jumlah bit yang sama).
robocat
5

Meskipun ada masalah yang dipublikasikan dengan baik dengan MD5 karena tabrakan, tabrakan UNINTENTIONAL antara data acak sangat jarang . Di sisi lain, jika Anda hashing pada nama file, itu bukan data acak, dan saya harapkan tabrakan dengan cepat.

pelakon
sumber
Satu-satunya masalah yang saya miliki dengan Taylors contoh adalah bahwa jika seseorang mendapat salinan database Anda mereka mungkin bisa mengetahui nomor kartu kredit menggunakan tabel pelangi ...
Sam Saffron
1
Walaupun saya tidak akan memilih untuk menggunakan MD5 untuk kartu kredit, tabel Rainbow dari semua nomor kartu kredit yang valid antara 10.000.000 (8 digit menjadi kartu kredit dengan panjang terkecil yang pernah saya lihat) dan 9.999.999.999.999.999.999 (angka 16 digit terbesar) masih merupakan angka besar tabel untuk menghasilkan. Mungkin ada cara yang lebih mudah untuk mencuri angka-angka itu.
acrosman
1

Tidak masalah seberapa besar kemungkinannya; itu mungkin. Ini bisa terjadi pada dua hal pertama yang Anda hash (sangat tidak mungkin, tetapi mungkin), jadi Anda harus mendukung tabrakan dari awal.

Karg
sumber
36
Tentu saja mungkin ada banyak hal buruk lainnya yang dapat terjadi dengan probabilitas 1/2 ^ 128. Anda mungkin tidak ingin memilih yang satu ini untuk dikhawatirkan.
Will Dean
2
Hal terburuk yang bisa terjadi di sini adalah Anda bisa mendapatkan foto. Untuk jumlah yang relatif kecil saya tidak akan khawatir. Sekarang jika perangkat lunak Anda mengendalikan pendaratan otomatis pesawat terbang, itu cerita lain.
Jim C
9
Anda tidak bisa serius. Anda harus memotong 6 miliar file per detik, setiap detik selama 100 tahun untuk mendapatkan peluang tabrakan. Bahkan jika Anda sangat sangat sial, itu mungkin akan membutuhkan lebih dari seluruh kapasitas S3 yang digunakan untuk lebih dari seumur hidup manusia.
Kornel
12
Miliaran kali lebih besar kemungkinannya bahwa basis data Anda dan cadangannya semuanya akan gagal. Tabrakan tidak perlu dikhawatirkan.
Artelius
5
Gunakan waktu pencegahan tabrakan membangun bunker untuk menempatkan server Anda! Meteor sial itu bisa mengenai Anda (sangat tidak mungkin, tetapi mungkin), jadi Anda harus mendukung tempat perlindungan meteor dari pengemis.
polvoazul
1

Tabrakan MD5 sangat tidak mungkin. Jika Anda memiliki 9 triliun MD5, hanya ada satu peluang dalam 9 triliun yang akan ada tabrakan.

Rick James
sumber
1
Banyak Jawaban lain berbicara tentang kemungkinan tabrakan saat menambahkan satu item lagi. Saya pikir Jawaban saya lebih berguna karena berbicara tentang kemungkinan seluruh tabel memiliki dup.
Rick James
1
Ini tidak ada hubungannya dengan MD5 dan tidak benar. Ini seperti mengatakan bahwa jika Anda memiliki 9 triliun kucing, ada peluang 1 banding 9 triliun bahwa orang lain memiliki kucing yang identik. Masalah utama di sini adalah Anda bisa mendapatkan hash yang sama dengan lebih dari satu nilai.
Joonas Alhonen
@JoonasAlhonen - Ya, itu benar. Dan banyak orang miskin menggunakannya sebagai alasan untuk membeli tiket Lotere lain yang tidak mampu mereka beli.
Rick James
Terima kasih, ini sebenarnya statistik yang sangat berguna. Peluang memiliki tabrakan saat memasukkan 9 triliun item. Terima kasih.
Tom P.