MD5'ten önce kaç rastgele öğe çarpışma üretiyor?


164

Amazon S3'te bir görüntü kütüphanem var. Her görüntü için, sunucumdaki kaynak URL'yi artı benzersiz bir dosya adı almak için bir zaman damgası md5. S3'ün alt dizinleri bulunamadığından, tüm bu görüntüleri tek bir düz klasörde saklamam gerekiyor.

Üretilen MD5 karma değerindeki çarpışmalar hakkında endişelenmem gerekiyor mu?

Bonus: MD5'in ürettiği karma değerde çarpışmalar görmeye başlamadan önce kaç dosya alabilirdim?



2
Gerçek cevap, ikinci dosyanın birinciyle aynı MD5'e sahip olabileceğidir. Ancak oranlar son derece düşüktür.
Rick James

Yanıtlar:


309

Yanlışlıkla çarpışan sadece iki karmanın olasılığı 1/2 128 olup, 340 undecillion 282 milyonda 366 milyon 920 octillion 938 septillion 463 sextillion 463 quintillion 374 katrilyon 607 trilyon 431 milyar 768 milyon 211 bin 456.

Ancak tüm karmaları tutarsanız, doğum günü paradoksu sayesinde olasılık biraz daha yüksektir . Herhangi bir karma ile diğer karma ile çarpışma olasılığının% 50 olması için 2 64 karma gerekir . Bu, bir çarpışma elde etmek için ortalama olarak 100 yıl boyunca saniyede 6 milyar dosya ayırmanız gerektiği anlamına gelir .


20
"çarpışma olasılığı 1/2 ^ 64" - ne? Çarpışma olasılığı, önceden hash edilmiş öğelerin sayısına bağlıdır, sabit bir sayı değildir. Aslında, tam olarak eşit olduğunu 1 - sPn/s^n, nerede s(arama alanının boyutu 2^128, bu durumda) ve nbir öğe sayısı karma hale getirilir. Muhtemelen düşündüğünüz şey 2^64,% 50 çarpışma şansına sahip olmak için MD5 karma işlemine ihtiyacınız olan yaklaşık öğe sayısıdır.
BlueRaja - Danny Pflughoeft

19
+1 çünkü her zaman 999 trilyon
lol'yi

7
Ne yazık ki, hala doğru değilsiniz. Karma işlevinin gerçekten rasgele olduğunu varsayıyorsunuz. O değil. Bu, çarpışma olasılığının daha yüksek olduğu anlamına gelir.
Jørgen Fogh

22
JørgenFogh: Ve tüm fizik yasaları da "doğru değil". Bu tür bir bilgiçlik gereksizdir çünkü cevabı anlamlı bir şekilde değiştirmez.
Kornel

21
Yani bir şans olduğunu söylüyorsun!
vargonyalı

27

S3'ün alt dizinleri olabilir. Anahtar adına bir "/" yazmanız yeterlidir ve dosyalara ayrı dizinlerdeymiş gibi erişebilirsiniz. Bunu, kullanıcı dosyalarını S3'teki kullanıcı kimliğine göre ayrı klasörlerde saklamak için kullanıyorum.

Örneğin: "mybucket / users / 1234 / somefile.jpg". Bir dosya sistemindeki bir dizinle tam olarak aynı değildir, ancak S3 API'sının neredeyse aynı şekilde çalışmasına izin veren bazı özelliklere sahiptir. "Users / 1234 /" ile başlayan tüm dosyaları listelemesini isteyebilirim ve bana o "dizindeki" tüm dosyaları gösterecektir.


7
Bu, bence bir içerik olmalı, çünkü aslında bir çarpışma olasılığı hakkındaki soruya cevap vermiyor
Ian Clark

18

Bekle, öyle mi:

md5(filename) + timestamp

veya:

md5(filename + timestamp)

Birincisi, bir GUID'e giden yolun en iyisiyseniz ve bunun için endişelenmeyeceğim. İkincisi ise, Karg'ın nihayetinde çarpışmalara nasıl gireceğinizle ilgili gönderisine bakın.


1
Lütfen zaman damgasının dahil edilmesinin çarpışma olasılığını nasıl artırdığına dikkat edin
Brad Thomas

14
@BradThomas: Öyle değil. MD5'in çarpışma riski, dosya adında veya dosya adı + zaman damgasının kombinasyonunda olsun aynıdır. Ancak ilk senaryoda, hem bir MD5 çarpışması hem de bir zaman damgası çarpışması olması gerekir.
Vincent Hubert

2
Bu yine de dakikada iki kullanıcı ile 2 ^ (128 ^ 60) çarpışma şansı bırakır. Kelimenin tam anlamıyla kullanılamaz.
Berry M.

2
@BradThomas Daha net olmak gerekirse: md5(filename) + timestampÇarpışma riskini büyük ölçüde azaltır çünkü bir çarpışma için genel olarak aynı zaman damgası için md5 çarpışmanız gerekir. md5(filename + timestamp)aynıdır md5(filename)dosya adı (rastgele bir şey daha rasgelelik ekleyerek sadece bireysel md5 sonucu değiştirir ve doğum günü problemi hala tüm md5 hash genelinde bulunduğundan) ile başlamak rastgele olduğunu varsayarak,.
robocat


7

Rastgele MD5 çarpışmaları son derece nadir olmakla birlikte, kullanıcılarınız dosya sağlayabilirse (sözlü olarak saklanacaktır), çarpışmaların oluşmasını sağlayabilirler. Yani, aynı MD5 toplamına ancak farklı verilere sahip iki dosya oluşturabilirler. Uygulamanızın bu durumu mantıklı bir şekilde ele alabileceğinden emin olun ya da SHA-256 gibi daha güçlü bir karma kullanın.


bir tuz kullanmak kullanıcı mühendisliği problemini halleder, değil mi?
StackOverflowed

Tuzun nasıl uygulandığına bağlıdır. Kullanıcı tarafından sağlanan verilerin bir öneki veya daha iyi bir HMAC anahtarı olması gerekir. Yine de savunmayı derinlemesine uygulamak hala iyi bir fikirdir.
bdonlan

SHA256 256 bit uzunluğunda olmasına rağmen, SHA256'yı daha az bitle keserek depoladığınız anahtar uzunluğuyla çarpışma riskini azaltabilirsiniz, örneğin SHA256 kullanın ancak 128 bite kısaltabilirsiniz (MD5'i kullanmaktan daha güvenlidir) aynı sayıda bit olmasına rağmen).
robocat

5

Çarpışmalar nedeniyle MD5 ile ilgili iyi duyurulmuş sorunlar olsa da, rastgele veriler arasındaki KESİNTİSİZ çarpışmalar oldukça nadirdir . Öte yandan, dosya adına hash ediyorsanız, bu rastgele veriler değildir ve çabucak çarpışmalar beklenir.


Taylors örneğiyle ilgili tek sorun, birisi veritabanınızın bir kopyasını alırsa, muhtemelen bir gökkuşağı tablosu kullanarak kredi kartı numaralarını anlayabilir ...
Sam Saffron

1
Kredi kartları için MD5 kullanmayı tercih etmememe rağmen, 10.000.000 (8 basamak gördüğüm en küçük uzunluktaki kredi kartıdır) ile 9.999.999.999.999.999 (en büyük 16 haneli sayı) arasındaki tüm geçerli kredi kartı numaralarından oluşan bir Rainbow tablosu hala büyük oluşturmak için tablo. Muhtemelen bu sayıları çalmanın daha kolay yolları vardır.
acrosman

1

Ne kadar muhtemel olduğu gerçekten önemli değil; bu mümkün. İlk iki şeyde olabilir (çok olası değil, ancak mümkün), bu yüzden başından itibaren çarpışmaları desteklemeniz gerekir.


37
Tabii ki 1/2 ^ 128 olasılığı ile ortaya çıkabilecek başka birçok kötü şey olabilir. Endişelenmek için bunu seçmek istemeyebilirsiniz.
Dean Dean

2
Burada olabilecek en kötü şey bir fotoğraf çekebilmenizdir. Nispeten küçük bir sayı için endişelenmem. Şimdi yazılımınız bir uçağa iniş yapan otopilotu kontrol ediyorsa, bu başka bir hikaye.
Jim C

9
Ciddi olamazsın. Çarpışma şansını artırmak için saniyede 6 milyar dosya, 100 yıl boyunca her saniye hash etmeniz gerekir. Çok şanssız olsanız bile, muhtemelen insan ömründen daha uzun süre kullanılan S3'ün tüm kapasitesinden daha fazlasını alacaktır.
Kornel

13
Veritabanınızın ve yedeklemelerinin milyarlarca kat daha fazla başarısız olması muhtemeldir. Çarpışmalar endişelenmeye değmez.
Artelius

6
Sunucunuzu yerleştirmek için bir sığınak inşa ederken çarpışma önleme süresini kullanın! Bu sinir bozucu göktaşları size vurabilir (çok olası değil, ancak mümkün), bu yüzden yalvarmadan meteor barınağını desteklemeniz gerekir.
polvoazul

1

MD5 çarpışması son derece düşüktür. Eğer varsa 9000000000000 MD5s, sadece bir şans var 9 trilyon çarpışma olacağını.


1
Diğer Yanıtların çoğu, bir öğe daha eklerken çarpışma olasılığı hakkında konuşur . Cevabımın daha yararlı olduğunu düşünüyorum çünkü muhtemelen tüm tablonun bir dup'e sahip olduğundan bahsediyor.
Rick James

1
Bunun MD5 ile bir ilgisi yoktur ve doğru değildir. Bu, 9 trilyon kediniz varsa, 9 trilyonda bir tanesinin başka birinin aynı kedisine sahip olma şansı olduğunu söylemek gibidir. Buradaki temel sorun, aynı karma değerini birden fazla değerle alabilmenizdir.
Joonas Alhonen

@JoonasAlhonen - Evet, bu doğru. Ve birçok yoksul insan bunu karşılayamayacakları başka bir Piyango bileti almak için bir bahane olarak kullanıyor.
Rick James

Teşekkürler, bu aslında çok yararlı bir istatistik. 9 trilyon madde eklendikten sonra çarpışma ihtimali. Teşekkürler.
Tom P.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.