İki farklı dizi aynı MD5 karma kodunu oluşturabilir mi?


96

İkili varlıklarımızın her biri için bir MD5 karması oluşturuyoruz. Bu, belirli bir ikili varlığın halihazırda uygulamamızda olup olmadığını kontrol etmek için kullanılır. Ancak iki farklı ikili varlığın aynı MD5 karmasını oluşturması mümkün mü? Öyleyse, iki farklı dizenin aynı MD5 karmasını oluşturması mümkün mü?

Yanıtlar:


94

Hatta milyarlarca varlık kümesi için, rastgele çarpışma olasılığı ihmal edilebilir derecede düşüktür - endişelenmenize gerek yok. Doğum günü paradoksu göz önüne alındığında, 2 ^ 64 (veya 18,446,744,073,709,551,616) varlık kümesi verildiğinde, bu küme içindeki tek bir MD5 çakışması olasılığı % 50'dir. Bu ölçekte, muhtemelen depolama kapasitesi açısından Google'ı geçeceksiniz.

Ancak, MD5 hash işlevi kırıldığı için (bir çarpışma saldırısına karşı savunmasızdır ), belirlenen herhangi bir saldırgan, birkaç saniye değerinde CPU gücü içinde 2 çarpışan varlık üretebilir . Dolayısıyla, MD5 kullanmak istiyorsanız, böyle bir saldırganın uygulamanızın güvenliğini tehlikeye atmayacağından emin olun!

Ayrıca, bir saldırganın veritabanınızdaki mevcut bir varlıkla çarpışma gerçekleştirebileceğinin sonuçlarını düşünün . MD5'e karşı (2011 itibariyle) bilinen bu tür saldırılar ( ön görüntü saldırıları ) olmasa da, çarpışma saldırıları üzerine mevcut araştırmayı genişleterek mümkün olabilir.

Bunların bir sorun olduğu ortaya çıkarsa, SHA-2 serisi hash fonksiyonlarına (SHA-256, SHA-384 ve SHA-512) bakmanızı öneririm. Olumsuz yanı, biraz daha yavaş olması ve daha uzun hash çıktısına sahip olmasıdır.


4
Anladığım kadarıyla 'Günler' bu noktada çok büyük bir abartma.
Nick Johnson

1
Doğru, gönderimi güncelledim. 2004 rastgele çarpışma saldırısı gerçekten çok hızlı. 2007 MD5 ön ekli çarpışma saldırısı günler sürebilir - ancak genellikle bir saldırgan için çok daha yararlıdır
intgr

2
Birkaç saat içinde iki farklı yürütülebilir dosya arasında bir çarpışma oluşturacak bir çalışma örneği için Rubens'in cevabına bakın. :)
Nick Johnson

39

MD5 bir karma işlevdir - yani evet, iki farklı dizi kesinlikle çarpışan MD5 kodları oluşturabilir.

Özellikle, MD5 kodlarının sabit bir uzunluğa sahip olduğunu ve bu nedenle olası MD5 kodlarının sayısının sınırlı olduğunu unutmayın. Bununla birlikte, dizelerin sayısı (herhangi bir uzunlukta) kesinlikle sınırsızdır, bu nedenle mantıksal olarak çarpışmaların olması gerektiği sonucuna varır.


13

Evet mümkün. Bu aslında bir Doğum Günü problemi . Bununla birlikte, rastgele seçilen iki dizinin aynı MD5 hash değerine sahip olma olasılığı çok düşüktür.

Örnekler için buna ve bu sorulara bakın .


1
Ne olasılığı? Çarpışma mı? Hayır, bu 1 olur, yani çok yüksek. ;-)
Konrad Rudolph

Doğru. Kesinlikle aynı MD5 hash değerine sahip iki dize vardır.
sharptooth

3
Bunu güvercin deliği sorunu olarak biliyorum.
Daniel A. White

doğum günü sorunu sadece bir çarpışma olasılığıyla ilgilidir. ispat için pidgeon deliği prensibini istediğiniz bir tane olmalıdır
jk.

Mümkünse cevabınızı iki kez oylardım. Ne kadar "düşük" bir olasılıktan bahsediyoruz?
Alex Spencer

11

Evet, elbette: MD5 karmalarının sonlu bir uzunluğu vardır, ancak MD5 karması uygulanabilen sonsuz sayıda olası karakter dizisi vardır.


11

Evet, iki farklı dizenin aynı MD5 karma kodunu oluşturması mümkündür.

İşte onaltılık dizede çok benzer ikili mesaj kullanan basit bir test:

$ echo '4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
c6b384c4968b28812b676b49d40c09f8af4ed4cc  -
008ee33a9d58b51cfeb425b0959121c9

$ echo '4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
c728d8d93091e9c7b87b43d9e33829379231d7ca  -
008ee33a9d58b51cfeb425b0959121c9

Farklı SHA-1 toplamı üretirler, ancak aynı MD5 hash değerini kullanırlar. İkinci olarak dizeler birbirine çok benziyor, bu yüzden aralarındaki farkı bulmak zor.

Fark, aşağıdaki komutla bulunabilir:

$ diff -u <(echo 4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2 | fold -w2) <(echo 4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2 | fold -w2)
--- /dev/fd/63  2016-02-05 12:55:04.000000000 +0000
+++ /dev/fd/62  2016-02-05 12:55:04.000000000 +0000
@@ -33,7 +33,7 @@
 af
 bf
 a2
-00
+02
 a8
 28
 4b
@@ -53,7 +53,7 @@
 6d
 a0
 d1
-55
+d5
 5d
 83
 60

Yukarıdaki çarpışma örneği, Marc Stevens'tan alınmıştır: MD5 , 2012 için tek bloklu çarpışma ; yöntemini kaynak kodu ile açıklar ( makaleye alternatif bağlantı ).


Başka bir test:

$ echo '0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
756f3044edf52611a51a8fa7ec8f95e273f21f82  -
cee9a457e790cf20d4bdaa6d69f01e41

$ echo '0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
6d5294e385f50c12745a4d901285ddbffd3842cb  -
cee9a457e790cf20d4bdaa6d69f01e41

Farklı SHA-1 toplamı, aynı MD5 karması.

Fark bir bayt içindedir:

$ diff -u <(echo 0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef | fold -w2) <(echo 0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef | fold -w2)
--- /dev/fd/63  2016-02-05 12:56:43.000000000 +0000
+++ /dev/fd/62  2016-02-05 12:56:43.000000000 +0000
@@ -19,7 +19,7 @@
 03
 65
 9e
-70
+74
 4f
 85
 34
@@ -41,7 +41,7 @@
 a3
 f4
 15
-5c
+dc
 bb
 86
 07

Yukarıdaki örnek, Tao Xie ve Dengguo Feng: Construct MD5 Collisions Using Just A Single Block Of Message , 2010'dan uyarlanmıştır .


İlişkili:


4

Evet mümkün. Hash çarpışması denir .

Bununla birlikte, MD5 gibi algoritmalar bir çarpışma olasılığını en aza indirecek şekilde tasarlanmıştır.

MD5'teki Wikipedia girişi, MD5'teki bilmeniz gereken bazı güvenlik açıklarını açıklıyor.


4

Daha bilgilendirici olmak için. Matematik açısından bakıldığında, Hash fonksiyonları enjekte edici değildir .
Bu, başlangıç ​​seti ile ortaya çıkan set arasında 1'e 1 (ancak tek yönlü) bir ilişki olmadığı anlamına gelir.

Wikipedia'da Bijection

DÜZENLEME: Tam olması için, enjekte hash fonksiyonları mevcuttur: buna Perfect hashing denir .


1
Çıktı boyutu girdi boyutundan daha küçük olduğunda mükemmel bir hashing işlevi yoktur.
Paŭlo Ebermann

3

Evet öyle! Çarpışma olacak bir olasılık (risk çok küçük olsa da). Değilse, oldukça etkili bir sıkıştırma yönteminiz olur!

DÜZENLEME : şöyle Konrad Rudolph söyler: girişinin bir potansiyel olarak sınırsız grubu çıkış (32 heks karakter) sonlu bir dizi dönüştürülen olacak çarpışmaların sonsuz sayıda sonuçlanır.


3

Başkalarının dediği gibi, evet, iki farklı girdi arasında çakışmalar olabilir. Ancak, sizin kullanım durumunuzda, bunun bir sorun olduğunu görmüyorum. Çarpışmalarla karşılaşacağınızdan son derece şüpheliyim - MD5'i önceki bir işimde bir dizi görüntü (JPG, bitmap, PNG, ham) biçimindeki yüz binlerce görüntü dosyasının parmak izini almak için kullandım ve bir çarpışma yaşamadım .

Bununla birlikte, bir tür verinin parmak izini almaya çalışıyorsanız, belki iki karma algoritma kullanabilirsiniz - bir girişin iki farklı algoritmanın aynı çıktısıyla sonuçlanması olasılığı neredeyse imkansızdır.


1
Aslında, bir saldırgan bir karma algoritma ile çarpışmalar üretebiliyorsa, bunu ikinci bir algoritma için de çarpışmalar elde etmek için kullanabilir. Bu yakın zamanda crypto.stackexchange'deki sorumda tartışıldı .
Paŭlo Ebermann

2

Karma çarpışmalar beklediğim kadar nadir olmadığından, ihtiyacımıza göre karma algoritmayı seçerken dikkatli olmamız gerektiğini düşünüyorum. Son zamanlarda projemde çok basit bir hash çarpışması vakası buldum. Hashing için xxhash'ın Python sarmalayıcısını kullanıyorum. Bağlantı: https://github.com/ewencp/pyhashxx

s1 = 'mdsAnalysisResult105588'
s2 = 'mdsAlertCompleteResult360224'
pyhashxx.hashxx(s1) # Out: 2535747266
pyhashxx.hashxx(s2) # Out: 2535747266

Sistemde çok zor bir önbelleğe alma sorununa neden oldu, sonra sonunda bunun bir hash çarpışması olduğunu buldum.


2

Bunun eski olduğunun farkındayım ama çözümüme katkıda bulunacağımı düşündüm. 2 ^ 128 olası hash kombinasyonu vardır. Ve böylece bir doğum günü paradoksunun 2 ^ 64 olasılığı. Aşağıdaki çözüm, çarpışma olasılığını ortadan kaldırmayacak olsa da, kesinlikle riski çok önemli bir miktarda azaltacaktır.

2^64 = 18,446,744,073,709,500,000 possible combinations

Yaptığım şey, hash'iniz olduğunu düşündüğünüz çok daha uzun bir sonuç dizisi elde etmek için giriş dizesine göre birkaç karma bir araya getirmekti ...

Yani bunun için sözde kodum:

Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))

Bu, bir çarpışmanın pratik olasılıksızlığıdır. Ancak süper paranoyak olmak istiyorsanız ve bunun gerçekleşmesini sağlayamıyorsanız ve depolama alanı sorun değil (bilgi işlem döngüleri de değil) ...

Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string)) 
         & Hash(Reverse(SpellOutLengthWithWords(Length(string)))) 
         & Hash(Rotate13(string)) Hash(Hash(string)) & Hash(Reverse(Hash(string)))

Tamam, en temiz çözüm değil, ama bu şimdi size ne kadar seyrek bir şekilde çarpışmaya gireceğiniz konusunda çok daha fazla oyun sağlıyor. Bu noktaya kadar, terimin tüm gerçekçi anlamlarında imkansız olduğunu varsayabilirim.

Benim iyiliğim için, bir çarpışma olasılığının yeterince seyrek olduğunu düşünüyorum, bunu "kesin ateş" olarak değil, ihtiyaca uygun olacak kadar olası olmadığını düşüneceğim.

Şimdi olası kombinasyonlar önemli ölçüde artar. Bunun size kaç tane kombinasyon getirebileceğine uzun zaman harcayabilseniz de, teoride söyleyeceğim, size yukarıda belirtilen sayıdan ÖNEMLİ BİR ŞEKİLDE daha fazlasını getirir

2^64 (or 18,446,744,073,709,551,616) 

Muhtemelen yüz basamak daha fazla. Bunun size verebileceği teorik maksimum değer

Ortaya çıkan dizelerin olası sayısı:

528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336

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.