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?
Jawaban:
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 .
sumber
1 - sPn/s^n
, di manas
ukuran ruang pencarian (2^128
dalam hal ini), dann
jumlah item yang di-hash. Apa yang Anda mungkin pikirkan adalah2^64
, yang merupakan perkiraan jumlah item yang Anda perlukan untuk hash MD5 untuk memiliki kemungkinan tabrakan 50%.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.
sumber
Jadi tunggu, apakah itu:
atau:
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.
sumber
md5(filename) + timestamp
mengurangi 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 denganmd5(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).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.
sumber
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.
sumber
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.
sumber
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.
sumber
Tabrakan MD5 sangat tidak mungkin. Jika Anda memiliki 9 triliun MD5, hanya ada satu peluang dalam 9 triliun yang akan ada tabrakan.
sumber