MD5 dosyaları benzersiz bir şekilde tanımlayacak kadar iyi mi?


139

MD5 karma bir dosya hala tüm MD5 algoritması ve güvenlik sorunları vb kırılması göz önüne alındığında benzersiz bir şekilde tanımlamak için yeterince iyi bir yöntem olarak kabul edilir mi? Güvenlik burada benim birincil endişem değil, ama her dosyayı benzersiz olarak tanımlamak.

Düşüncesi olan var mı?


2
Aslında şu anda uygulamalarımdan birinde kullanıyorum ve bildiğim kadarıyla dosyaları benzersiz olarak tanımlamak için yeterince iyi.
Müsait değil

2
Muhtemelen bu soruyu bulacaksınız: stackoverflow.com/questions/862346/… faydalı.
Sharptooth

Kaç dosya tanımlamanız gerekiyor? 128 bit çıktı, bu yüzden birkaç binlerce dosyayı tanımlamaya çalışıyorsanız, sorun değil. Ama bundan daha fazlasını tanımlamaya çalışıyorsanız, çarpışmalara / doğum günü paradoksuna çarpıyor olabilirsiniz.
Marcin

Görüntü dosyaları, jpg, png ve gif olacaklar. Ve evet bence limit birkaç bin olacak ... Ama kaç dosya bana sorun çıkartacağını düşünüyorsun?
Ranhiru Jude Cooray

Yanıtlar:


89

Evet. MD5 güvenlik açısından tamamen kırılmıştır, ancak kazayla çarpışma olasılığı hala kaybolmaktadır. Dosyaların güvendiğiniz ve kötü niyetli olabilecek biri tarafından oluşturulmadığından emin olun.


2
@none: İlk sorunuz için buraya bakın . Korkarım diğer soruları anlamıyorum.
Marcelo Cantos

9
@ 0xA3: Ne sen ne de ben OP'nin hangi dosyalara atıfta bulunduğu ya da bir uzlaşmanın ne kadar zarar vereceği hakkında hiçbir fikrim yok. Bildiğimiz her şey için çocuklarının bebek fotoğraf koleksiyonu olabilir. Amacım gerçekleri sağlamak; bir başkasının onlarla yaptığı şey onların işi. Ayrıca Bruce Schneier'in şifrenizi yazmanızı tavsiye ettiğini düşünün ; her şeyin Fort Knox'ta depolanması gerekmez. Bazı şeyler saksı altında iyi bir şekilde saklanır.
Marcelo Cantos

3
@Marcelo Cantos, burada eksik olanın 'güvenlik' teriminin farklılaşması veya paketten çıkarılması olduğunu düşünüyorum. Açıkçası insanlar, sağlama toplamı çalışmalarının herhangi bir kullanımı için 'güvenlik' varsayıyorlar, ancak Marcelo'nun muhtemelen olası isimlendirmesi 'bir laboratuvarda'.
hpavc

5
Kesinlikle katılmıyorum. Farklı bir karma değeri dosyaların farklı olduğunu gösterir. Ancak eşit bir karma değeri için: karma aynı ise "her ikisi de aynıdır" diyemezsiniz: yalnızca byte-byte için karşılaştırma yapabilirsiniz. Bir karma, tüm dosya için farklı değerlerin sayısından daha küçük olan birçok büyüklük sırasıdır , bu nedenle her karma değeri için çok, çok, çok olası çarpışma vardır. Yalnızca bilinen bir dosyanın kopyalanması durumunda (bilinen bir karma ile) özdeş bir karma değeri "muhtemelen" 2'nin doğru kopyalandığı anlamına gelir (o zaman bile,% 100 emin değil, ancak büyük olasılıkla).
Olivier Dulac

3
Tamam, benim matem berbat. GUID'lerin yaklaşık 122 bit entropisi vardır ve bu nedenle bir milyar dosyada herhangi bir yerde çarpışma olasılığı yaklaşık 2 ^ (2 * 30 - 122) = 2 ^ -62'dir. Bu benim orijinal hesaplamamdan çok daha yüksek olsa da, hala kabaca 4 çeyrek milyonda bir.
Marcelo Cantos

32

Pratik amaçlar için, oluşturulan karma uygun şekilde rastgele olabilir, ancak teorik olarak Pigeonhole prensibi nedeniyle her zaman bir çarpışma olasılığı vardır . Farklı karma değerlere sahip olmak, dosyaların farklı olduğu anlamına gelir, ancak aynı karma değere sahip olmak dosyaların aynı olduğu anlamına gelmez.

Bu amaçla bir karma işlevinin kullanılması - güvenlik endişe olsun ya da olmasın - her zaman, özellikle karma algoritmanın kolayca çarpışma yarattığı biliniyorsa, her zaman yalnızca bir kontrolün ilk adımı olmalıdır. Aynı karma değere sahip iki dosyanın farklı olup olmadığını güvenilir bir şekilde bulmak için bu dosyaları bayt-byte ile karşılaştırmanız gerekir.


16
@Ranhiru. Hayır. Karma size (MD5 için) yalnızca 16 bayt uzunluğunda bir 'özet' değeri verir. To garanti dosyalar aynıdır sen bayt çekle byte yapmak gerekir. Hangi hash algoritmasını seçerseniz seçin, her zaman bir çarpışma olasılığı vardır.
PaulG

6
@Ranhiru. Bu cevabı tekrar okuyun, buradaki en kapsamlı cevap. Hashing ilk adım olarak kullanılabilir, bu da dosyaların aynı olduğundan 99.99 ^ e% kesinlik elde etmenizi sağlar, ancak kesinlikle% 100 emin olmak istiyorsanız , bir bayt bayt kontrolü yapmanız gerekir. MD5, SHA veya başka bir algoritma kullansanız da bu doğrudur.
PaulG

7
Bu cevap yanlış. Kurcalanmanın önlenmesi ve benzersizliğin doğrulanması aynı şeydir. Ayrıca, hash benzersizliği garanti etmezken, gerçek karşılaştırma da sağlanmaz. Aslında, bir karmanın yanlışlıkla çarpışma olasılığı, normal güneş gama ışını emisyonları tarafından üretilen CPU'daki aksaklıklar nedeniyle karşılaştırmanın başarısız olma olasılığından daha düşüktür. Ve genellikle dosyanın tek kaynağının bir web sunucusu içinde dünyanın diğer tarafında oturduğunu ve karşılaştırma amacıyla sahip olduğunuz tek bağımsız bilginin karması olduğunu unutmayın.
Marcelo Cantos

8
@Marcelo. Yanlışlıkla çarpışmanın yanlışlıkla bit döndürmelerinden daha az olası olduğu mantıklı bir mantık değildir (byte byte karşılaştırması yaparken). Hash oluştururken hala aynı bit çevirme şansınız var (ve muhtemelen daha fazla işlem süresi söz konusu olduğundan daha fazla). @Thomas, orijinali, benzersizliği tanımlamanın garantili bir yolu olmadığını önermek için ortaya koydu, ancak bit döndürmelerin etkisi oldukça tartışmalıdır. En kötümser tahmin GB / saat başına 1 flip'dir ve ECC RAM bunu bile kaldıracaktır.
PaulG

2
[kaynak belirtilmeli] "karma yanlışlıkla çarpışan olasılığı nedeniyle, normal güneş gama ışını emisyonları tarafından üretilen CPU yaşanan aksaklıkla aslında alt karşılaştırmanın olasılık başarısız olmasıdır"
Endolit

20

Eğer rakipleriniz yoksa MD5 yeterince iyi olacaktır. Bununla birlikte, birisi (bilerek) aynı değere (bu bir çarpışma denir) hash olan iki ayrı dosya oluşturabilir ve kesin durumunuza bağlı olarak bu bir sorun olabilir veya olmayabilir.

Bilinen MD5 zayıflıklarının belirli bir bağlam için geçerli olup olmadığını bilmek ince bir konu olduğundan MD5'in kullanılmaması önerilir. Çarpmaya dayanıklı bir hash fonksiyonu (SHA-256 veya SHA-512) kullanmak güvenli cevaptır. Ayrıca, MD5'i kullanmak kötü halkla ilişkilerdir (MD5 kullanıyorsanız, kendinizi haklı çıkarmaya hazır olun; oysa kimse SHA-256'yı kullandığınızı sorgulamayacaktır).


2
Okuyucu karma işlemine aşina değilse, bu cevap biraz yanıltıcı olabilir. SHA hakkında karma çarpışmaları önleyen büyülü bir şey yoktur , karma çarpışma saldırılarına karşı daha dirençlidirler . Dosyaların aynı olduğundan% 99.999 ^ e% 'den fazla olmak istiyorsanız, yine de bir bayt bayt denetimi yapmanız gerekir.
PaulG

7
Aslında bir bayt-to-byte karşılaştırma (örneğin dönüştürme Bir biraz saygısız bir kozmik ışın nedeniyle başarısız olabilir return 0;bir içine return 1;). Bu son derece düşüktür, ancak SHA-256 ile çarpışma riski bundan daha da küçüktür. Matematiksel olarak, aynı değere hash olan iki dosyanın aynı olduğundan emin olamazsınız, ancak karşılaştırma için bir bilgisayar kullandığınız sürece dosyaları da karşılaştırarak bundan emin olamazsınız. Demek istediğim, 99.999 ....% 9 kesinliğin ötesine geçmenin anlamsız olması ve SHA-256 zaten bundan daha fazlasını sağlıyor.
Thomas Pornin

2
Ne, ECC hafızasını kullanmıyor musunuz? ). İyi yorum, çok ilginç düşünceler.
PaulG

1
Teneke folyo şapkası unutma! Daha ciddisi, çarpışmalarla ilgili bu factoidleri nasıl biliyorsunuz ve bunu bir şekilde doğruladınız mı?
James P.

@ThomasPornin Kozmik ışın biti döndürmeleri MD5 yöntemini de etkileyecektir, bu yüzden hala daha kötüdür.
endolith

9

MD5 çarpışmalara neden olabilir. Teorik olarak, pek olası olmasa da, arka arkaya bir milyon dosya aynı hash üretebilir. Değeri kaydetmeden önce şansınızı test etmeyin ve md5 çarpışmalarını kontrol edin.

Ben şahsen büyük dosyaları karma yükünü azaltır rastgele dizeleri md5 oluşturmak istiyorum. Çarpışmalar bulunduğunda, ekteki döngü sayacı ile yineleme ve yeniden karma yapıyorum.

Güvercin deliği prensibini okuyabilirsiniz .


6

Ben tavsiye etmem. Uygulama çok kullanıcılı sistemde çalışırsa, aynı md5 hashına sahip iki dosyaya sahip olan kullanıcı olabilir (mühendis olabilir ve bu tür dosyalarla oynayabilir veya sadece meraklı olabilirler - kolayca http: / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html , bu cevabı yazarken kendim iki örnek indirdim ). Başka bir şey, bazı uygulamaların herhangi bir nedenle bu tür kopyaları depolayabilmesidir (bu tür uygulamalar varsa, ancak olasılık varsa emin değilim).

Programınız tarafından oluşturulan dosyaları benzersiz bir şekilde tanımıyorsanız, MD5'i kullanmanın uygun olduğunu söyleyebilirim. Aksi takdirde, henüz çarpışmaların bilinmediği başka bir karma işlev öneririm.


2

Şahsen insanların gerçekten yapmak istedikleri zaman benzersiz tanımlayıcılar olarak davranmak için diğer nesnelerin ham sağlama toplamlarını (yönteminizi seçin) benzersiz tanımlayıcılara sahip olduklarını düşünüyorum. Bu kullanım için bir nesnenin parmak izi alınması amaç değildi ve bir uuid veya benzer bütünlük mekanizması kullanmaktan daha fazla düşünmeyi gerektiriyor olabilir.


0

MD5 bozuldu, bunun yerine SHA1'i kullanabilirsiniz (çoğu dilde uygulanır)


Bu çok iyi bir cevap. MD5, Mayıs 2018'den itibaren Avrupa'daki Hukuk ve Muhasebe davalarında kullanım için kabul edilemez.
Bert Sinnema

@BertSinnema beni hangi hash fonksiyonlarının kabul edilebilir olduğunu tanımlayan kaynağa yönlendirebilir misiniz, lütfen?
berezovskyi

@GregSchmit belki OP OP kendi başına kriptografik gücü umursamadı çünkü. "Zaten güvenlik dışı bağlamda MD5 kullanıyorum, kodu güncellemek için zaman harcamam gerekiyor mu?" bir şey. Ve bu bağlamda cevap muhtemelen yanlıştı ve SHA1 o zamandan beri kırıldı.
berezovskyi

0

Kısa (<birkaç K?) Dizgileri (veya dosyaları) hash ederken, biri gerçek dize ve diğeri kısa bir asimetrik dize ile birleştirilen iki md5 karma anahtarı oluşturabilir. Örnek: md5 (ters (dize || '1010')). Ek dizeyi eklemek, bir dizi özdeş bit içeren dosyaların bile iki farklı anahtar üretmesini sağlar. Bu şema altında bile, iki karma anahtarın özdeş olmayan dizeler için aynı olma teorik bir şansı olduğunu, ancak olasılıkın çok küçük göründüğünü - tek md5 çarpışma olasılığının karesi sırasına göre bir şey olduğunu ve zaman tasarrufu sağladığını lütfen unutmayın. dosya sayısı arttıkça dikkate değer olabilir. İkinci dizgeyi oluşturmak için daha ayrıntılı planlar da düşünülebilir,

Çarpışmaları kontrol etmek için bu testi bir db'deki tüm bit_vector'lar için md5 hash anahtarlarının benzersizliği için çalıştırabilirsiniz:

md5 (bit_vector), say (*), bit_and (bit_vector) ile db'den
md5 (bit_vector) ile bit_vector grubu seçin, bit_vector (bit_vector) (bit_vector) <> bit_vector


Akıllıca fikir. Bir "saldırgan" aynı md5 hash ile sahte bir dosya yaparsa, o "tuzlama" bilmeden ve içeriği tersine çevirmek farklı bir karma oluşturacak sürece yardımcı olmaz. Bunun gibi 2 md5 tuşunun kullanılması olasılıkları çok azaltacaktır. Sadece yerel olarak hesaplamadan önce bir tuz kullanarak bir "saldırı" önlemek için yeterli olacaktır.
Wolf5

0

MD5'i büyük miktarda dosya verisi depolarken bir olasılık göstergesi olarak düşünmeyi seviyorum.

Karma eşitse, bayt bayt dosyaları karşılaştırmak zorunda biliyorum, ama bu yanlış bir nedenle sadece birkaç kez olabilir, aksi takdirde (karma eşit değildir) İki farklı dosya hakkında konuştuğumuzdan emin olabilirim .

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.