Untuk sekumpulan bahkan miliaran aset, kemungkinan tabrakan acak sangat kecil - tidak ada yang perlu Anda khawatirkan. Mempertimbangkan paradoks ulang tahun , mengingat satu set aset 2 ^ 64 (atau 18.446.744.073.709.551.616), probabilitas tabrakan MD5 tunggal dalam set ini adalah 50%. Pada skala ini, Anda mungkin mengalahkan Google dalam hal kapasitas penyimpanan.
Namun, karena fungsi hash MD5 telah rusak (rentan terhadap serangan tabrakan ), setiap penyerang yang ditentukan dapat menghasilkan 2 aset yang bertabrakan dalam hitungan detik dari daya CPU. Jadi jika Anda ingin menggunakan MD5, pastikan penyerang seperti itu tidak membahayakan keamanan aplikasi Anda!
Selain itu, pertimbangkan konsekuensi jika penyerang dapat memalsukan tabrakan ke aset yang ada di database Anda. Meskipun tidak ada serangan yang diketahui ( preimage ) terhadap MD5 (per 2011), hal itu bisa menjadi mungkin dengan memperluas penelitian saat ini tentang serangan tabrakan.
Jika ini ternyata menjadi masalah, saya sarankan untuk melihat rangkaian fungsi hash SHA-2 (SHA-256, SHA-384 dan SHA-512). Kelemahannya adalah sedikit lebih lambat dan memiliki keluaran hash yang lebih lama.
MD5 adalah fungsi hash - jadi ya, dua string berbeda benar-benar dapat menghasilkan kode MD5 yang bertabrakan.
Secara khusus, perhatikan bahwa kode MD5 memiliki panjang tetap sehingga kemungkinan jumlah kode MD5 terbatas. Jumlah string (dengan panjang berapa pun), bagaimanapun, pasti tidak terbatas sehingga secara logis harus ada tabrakan.
sumber
Ya, itu mungkin. Ini sebenarnya masalah ulang tahun . Namun kemungkinan dua string yang dipilih secara acak memiliki hash MD5 yang sama sangat rendah.
Lihat ini dan pertanyaan ini sebagai contoh.
sumber
Ya, tentu saja: Hash MD5 memiliki panjang yang terbatas, tetapi ada kemungkinan string karakter yang tidak terbatas yang dapat di-hash MD5.
sumber
Ya, ada kemungkinan dua string berbeda dapat menghasilkan kode hash MD5 yang sama.
Berikut adalah tes sederhana menggunakan pesan biner yang sangat mirip dalam string hex:
Mereka menghasilkan jumlah SHA-1 yang berbeda, tetapi nilai hash MD5 yang sama. Kedua, stringnya sangat mirip, jadi sulit untuk menemukan perbedaan di antara keduanya.
Perbedaannya dapat ditemukan dengan perintah berikut:
Contoh tumbukan di atas diambil dari Marc Stevens: Tabrakan satu blok untuk MD5 , 2012; dia menjelaskan metodenya, dengan kode sumber ( tautan alternatif ke kertas ).
Tes lain:
Jumlah SHA-1 berbeda, hash MD5 yang sama.
Selisihnya dalam satu byte:
Contoh di atas diadaptasi dari Tao Xie dan Dengguo Feng: Membangun Tabrakan MD5 Menggunakan Hanya Satu Blok Pesan , 2010.
Terkait:
sumber
Ya, itu mungkin. Ini disebut tabrakan Hash .
Karena itu, algoritma seperti MD5 dirancang untuk meminimalkan kemungkinan tabrakan.
Entri Wikipedia di MD5 menjelaskan beberapa kerentanan di MD5, yang harus Anda waspadai.
sumber
Hanya agar lebih informatif. Dari sudut pandang matematika, fungsi Hash tidak bersifat injeksi .
Ini berarti bahwa tidak ada hubungan 1 ke 1 (tapi satu arah) antara himpunan awal dan hasil.
Bijection di wikipedia
EDIT: ada fungsi hash injeksi lengkap: ini disebut hashing sempurna .
sumber
Ya itu! Tabrakan akan menjadi kemungkinan (meskipun, risikonya sangat kecil). Jika tidak, Anda akan memiliki metode kompresi yang cukup efektif!
EDIT : Seperti yang dikatakan Konrad Rudolph: Satu set input yang berpotensi tidak terbatas yang diubah menjadi satu set output terbatas (32 karakter hex) akan menghasilkan tabrakan dalam jumlah yang tak terbatas.
sumber
Seperti yang dikatakan orang lain, ya, mungkin ada benturan antara dua input yang berbeda. Namun, dalam kasus penggunaan Anda, saya tidak melihat itu menjadi masalah. Saya sangat ragu Anda akan mengalami tabrakan - Saya telah menggunakan MD5 untuk mengambil sidik jari ratusan ribu file gambar dari sejumlah format gambar (JPG, bitmap, PNG, mentah) di pekerjaan sebelumnya dan saya tidak mengalami tabrakan .
Namun, jika Anda mencoba mengambil sidik jari beberapa jenis data, mungkin Anda dapat menggunakan dua algoritme hash - kemungkinan satu masukan menghasilkan keluaran yang sama dari dua algoritme berbeda hampir mustahil.
sumber
Saya menyadari ini sudah tua, tetapi saya pikir saya akan menyumbangkan solusi saya. Ada 2 ^ 128 kemungkinan kombinasi hash. Dan dengan demikian kemungkinan 2 ^ 64 dari paradoks ulang tahun. Meskipun solusi di bawah ini tidak akan menghilangkan kemungkinan tabrakan, itu pasti akan mengurangi risiko dalam jumlah yang sangat besar.
Apa yang telah saya lakukan adalah saya menggabungkan beberapa hash berdasarkan string input untuk mendapatkan string yang lebih panjang yang Anda anggap hash ...
Jadi pseudo-code saya untuk ini adalah:
Itu adalah ketidakmungkinan praktis tabrakan. Tetapi jika Anda ingin menjadi super paranoid dan tidak dapat mewujudkannya, dan ruang penyimpanan tidak menjadi masalah (juga bukan siklus komputasi) ...
Oke, bukan solusi terbersih, tapi ini sekarang membuat Anda lebih banyak bermain dengan seberapa jarang Anda akan mengalami tabrakan. Sampai-sampai saya mungkin menganggap tidak mungkin dalam semua pengertian realistis istilah tersebut.
Demi saya, saya pikir kemungkinan tabrakan cukup jarang sehingga saya akan menganggap ini bukan "pasti" tetapi sangat tidak mungkin terjadi sehingga sesuai dengan kebutuhan.
Sekarang kemungkinan kombinasi naik secara signifikan. Meskipun Anda bisa menghabiskan waktu lama untuk mengetahui berapa banyak kombinasi yang bisa Anda dapatkan, saya akan mengatakan secara teori itu membuat Anda SIGNIFIKAN lebih dari jumlah yang dikutip di atas
Mungkin sekitar seratus digit lagi. Maks teoritis yang bisa diberikan ini kepada Anda
Jumlah kemungkinan string yang dihasilkan:
528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336
sumber
Saya pikir kita perlu berhati-hati dalam memilih algoritma hashing sesuai kebutuhan kita, karena tabrakan hash tidak jarang seperti yang saya harapkan. Saya baru-baru ini menemukan kasus tabrakan hash yang sangat sederhana dalam proyek saya. Saya menggunakan pembungkus Python xxhash untuk hashing. Tautan: https://github.com/ewencp/pyhashxx
Ini menyebabkan masalah caching yang sangat rumit dalam sistem, kemudian saya akhirnya menemukan bahwa itu adalah tabrakan hash.
sumber