MD5 hash değerleri nasıl geri döndürülemez?


92

Her zaman merak ettiğim bir kavram, kriptografik hash fonksiyonlarının ve değerlerinin kullanımıdır. Bu işlevlerin benzersiz ve tersine çevrilmesi neredeyse imkansız bir hash değeri üretebileceğini anlıyorum, ancak işte her zaman merak ettiğim şey:

Sunucumda, PHP'de üretiyorum:

md5("stackoverflow.com") = "d0cc85b26f2ceb8714b978e07def4f6e"

Aynı dizeyi bir MD5 işlevi aracılığıyla çalıştırdığınızda, PHP kurulumunuzda aynı sonucu alırsınız. Bir başlangıç ​​değerinden bir değer üretmek için bir süreç kullanılıyor.

Bu, olan biteni yapısızlaştırmanın ve hash değerini tersine çevirmenin bir yolu olduğu anlamına gelmiyor mu?

Ortaya çıkan dizgelerin yeniden izlenmesini imkansız kılan bu işlevlerle ilgili nedir?


54
Tersine çevrilemeyen değere basit bir örnek, örneğin modulodur. Örneğin,% 10 3 = 1, ancak 1'den 10'a ters çeviremezsiniz çünkü 4 de olabilir
Gab Royer

57
Verileri yeniden yapılandırabilseydiniz şimdiye kadarki en verimli kayıpsız sıkıştırma algoritmasına sahip olurdunuz :)
Dan Diplo

Yanıtlar:


205

Girdi materyali, çıktının her zaman 128 bit uzunluğunda olduğu sonsuz uzunlukta olabilir. Bu, sonsuz sayıda giriş dizesinin aynı çıktıyı üreteceği anlamına gelir.

Rastgele bir sayı seçer ve onu 2'ye bölerseniz ancak yalnızca kalanı yazarsanız, sırasıyla 0 veya 1 - çift veya tek elde edersiniz. O 0 veya 1'i alıp orijinal numarayı almak mümkün mü?


4
Yani, ne sayı -> kalan ne de dizge -> md5 "enjekte edici işlevler" değildir.
Federico A. Ramponi

Federico, kesinlikle önyargılı işlevler olmadığını mı kastediyorsunuz? İkisi de enjekte edici.
Mihai Limbășan

10
moocha: Enjeksiyon 1'e 1 anlamına gelir. Etki alanı aralıktan daha büyük olduğu için MD5 kesinlikle 1'e 1 değildir. Dikkate değer bir diğer nokta da, bir MD5 sağlama toplamı verildiğinde, kendisine hash olan bir dizeyi bile bulmanın çok zor olmasıdır. Açıklama için cevaba eklemeye değer olabilir.
biozinc

4
Benzersiz değerler üreten bir hash fonksiyonuna sahip olmak imkansızdır. Sınırsız sayıda değeri sınırlı sayıda değerle eşleştiriyorsunuz, bu da çarpışmaları garanti ediyor.
Serafina Brocious

4
Cevabınızın kilit noktaya değinmediğini öneririm. Biozinc'in bahsettiği gibi, güvenli bir parola karması için önemli olan, çıktıyı oluşturan herhangi bir girdi bulamamanız, orijinal girdiyi bulamamanız değil. Bu notta, MD5'in olabileceği kadar güvenli olması gerekmez ( en.wikipedia.org/wiki/MD5#Collision_vulnerabilities ).
Mike Pelley

53

MD5 gibi hash fonksiyonları tersine çevrilebilir olsaydı, bu, veri sıkıştırma algoritmalarının tarihinde bir dönüm noktası olayı olurdu! MD5 geri dönüşümlü olsaydı, keyfi boyuttaki rastgele veri yığınlarının herhangi bir bilgi kaybı olmaksızın sadece 128 bit ile temsil edilebileceğini görmek kolaydır. Böylelikle, orijinal mesajın boyutuna bakılmaksızın, orijinal mesajı 128 bitlik bir sayıdan yeniden yapılandırabilirdiniz.


9
Bunun yerine
Colin Pickard

16
@Colin Pickard: Biz olmaz indirirken artık linux dağıtımları, biz olurdu yazmaktan . :)
tzot

30

Burada en upvoted cevaplar vurgulamak aksine, sigara birebirlik (yani aynı değere karma birkaç dizeleri vardır) büyük (potansiyel olarak sonsuz) giriş büyüklüğü ve sabit çıkış boyutu arasındaki farktan kaynaklanan bir kriptografik hash fonksiyonunun değil önemli nokta - aslında, bu çarpışmaların mümkün olduğunca nadiren meydana geldiği hash fonksiyonlarını tercih ediyoruz.

Şu işlevi düşünün (soru olarak PHP gösteriminde):

function simple_hash($input) {
     return bin2hex(substr(str_pad($input, 16), 0, 16));
}

Bu, dize çok kısaysa bazı boşluklar ekler ve ardından dizenin ilk 16 baytını alır, ardından onu onaltılık olarak kodlar. MD5 hash ile aynı çıktı boyutuna sahiptir (32 onaltılık karakter veya bin2hex bölümünü atlarsak 16 bayt).

print simple_hash("stackoverflow.com");

Bu çıktı:

737461636b6f766572666c6f772e636f6d

Bu işlev aynı zamanda Cody'nin MD5 cevabında vurgulandığı gibi aynı non-non -jectivity özelliğine sahiptir: Herhangi bir boyuttaki dizeleri geçirebiliriz (bilgisayarımıza sığdıkları sürece) ve yalnızca 32 onaltılık basamak çıkarır. Elbette enjekte edilemez.

Ancak bu durumda, aynı hash ile eşleşen bir dizge bulmak önemsizdir (sadece hash'inize uygulayın hex2binve ona sahipsiniz). Orijinal dizeniz 16 uzunluğundaysa (örneğimiz gibi), bu orijinal dizeyi bile elde edeceksiniz. Girdinin uzunluğunun oldukça kısa olduğunu bilseniz bile, MD5 için bu türden hiçbir şey mümkün olmamalıdır (eşleşen bir tane bulana kadar olası tüm girdileri denemekten başka, örneğin kaba kuvvet saldırısı).

Kriptografik bir hash işlevi için önemli varsayımlar şunlardır:

  • belirli bir hash üreten herhangi bir dizi bulmak zordur (ön görüntü direnci)
  • belirli bir dizeyle aynı karmayı üreten farklı bir dizi bulmak zordur (ikinci ön görüntü direnci)
  • aynı hash'e sahip herhangi bir dizi bulmak zordur (çarpışma direnci)

Açıkçası benim simple_hashişlevim bu koşulların hiçbirini karşılamıyor. (Aslında, girdi alanını "16 baytlık dizelerle" sınırlarsak, o zaman benim işlevim enjekte edici hale gelir ve bu nedenle kanıtlanabilir ikinci ön görüntü dirençli ve çarpışmaya dirençli olur.)

Artık MD5'e karşı çarpışma saldırıları var (örneğin, aynı önekle bile, aynı hash'e sahip, epeyce çalışmayla, ancak çok fazla çalışma imkansız olmayan bir dizi çift üretmek mümkündür), bu nedenle kullanmamalısınız Kritik her şey için MD5. Henüz bir ön görüntü saldırısı yok, ancak saldırılar daha iyi olacak.

Asıl soruyu cevaplamak için:

Ortaya çıkan dizgelerin yeniden izlenmesini imkansız kılan bu işlevlerle ilgili nedir?

MD5'in (ve Merkle-Damgard yapısında inşa edilen diğer hash işlevlerinin) etkin bir şekilde yaptığı şey, anahtar olarak mesaj ve "düz metin" olarak bazı sabit değerler içeren bir şifreleme algoritması uygulamak ve sonuçta elde edilen şifreli metni karma olarak kullanmaktır. (Bundan önce, giriş doldurulur ve bloklar halinde bölünür, bu blokların her biri önceki bloğun çıktısını şifrelemek için kullanılır, ters hesaplamaları önlemek için girişiyle birlikte XORed.)

Modern şifreleme algoritmaları (karma işlevlerde kullanılanlar dahil), hem düz metin hem de şifreli metin verildiğinde (veya düşman bunlardan birini seçtiğinde bile) anahtarı kurtarmayı zorlaştıracak şekilde yapılmıştır. Bunu genellikle, her çıkış bitinin her bir anahtar biti (birkaç kez) ve ayrıca her giriş biti tarafından belirleneceği bir şekilde çok sayıda bit karıştırma işlemi yaparak yaparlar. Bu şekilde, yalnızca tam anahtarı ve girişi veya çıkışı biliyorsanız, içeride olanları kolayca takip edebilirsiniz.

MD5 benzeri karma işlevler ve bir ön görüntü saldırısı için (işleri kolaylaştırmak için tek bloklu bir karma dizeyle), şifreleme işlevinizin yalnızca giriş ve çıkışına sahip olursunuz, ancak anahtarınız yoktur (aradığınız şey budur).


4
Evet, bunun oldukça geç bir cevap olduğunu biliyorum ama kabul edilen cevabın bu şekilde kalmasına izin verilmemeli.
Paŭlo Ebermann

Sanırım eleştirilerinizin bir değeri var ama asıl soruyu cevaplayamadınız "Bu işlevlerle ilgili olarak ortaya çıkan dizelerin yeniden izlenmesini imkansız kılan nedir?" Cevabınız, bir kriptografik hash'in sahip olması gereken niteliklere odaklanır, ancak md5 tarafından nasıl uygulandıklarına dair sıfır açıklamaya sahiptir. Nasıl tersine çevrilemeyeceğini göstermek için MD5 toplamlarını hesaplamak için kesin algoritmayı burada belirtebilirsiniz, ancak diğer cevaplar nitty-gritties'e girmeden daha basit bir açıklama sağlar.
Autodidact

(devam ...) 2. Bu açıklamalar, bu tür işlemlerin bilgi kaybetmesine ve geri döndürülemez hale gelmesine neden olan temel bir sorunu göstermek için "Matematik" i kullanır.
Autodidact

1
@SandeepDatta Bununla ilgili bazı paragraflar ekledim.
Paŭlo Ebermann

2
Bu konudaki diğer cevap teknik olarak daha doğru olsa da, bu cevap en faydalı olanıdır. Enjekte edici olmayan f (x) = 1 işlevi geri döndürülemez ancak ilginç değildir. Karmanın faydası, belirli bir çıktı veren herhangi bir girdi bulmanın zor olduğu ön görüntü direncinde yatmaktadır .
Justin J Stark

18

Cody Brocious'ın cevabı doğru olanıdır. Açıkçası, bir karma işlevi "tersine çeviremezsiniz" çünkü birçok dizge aynı karma ile eşlenir. Bununla birlikte, ya belirli bir hash ile eşlenen bir dizi bulmanın ya da aynı hash ile eşlenen iki dizgeyi bulmanın (yani bir çarpışma ) bir kriptanalist için büyük atılımlar olacağına dikkat edin. Her iki sorunun da en büyük zorluğu, iyi hash fonksiyonlarının kriptografide kullanılmasının nedenidir.


12

MD5, benzersiz bir hash değeri yaratmaz; MD5'in amacı, kaynakta küçük bir değişikliğe bağlı olarak önemli ölçüde değişen bir değeri hızlı bir şekilde üretmektir.

Örneğin,

"hello" -> "1ab53"
"Hello" -> "993LB"
"ZR#!RELSIEKF" -> "1ab53"

(Açıkçası bu gerçek MD5 şifrelemesi değil)

Çoğu karma (tümü değilse) da benzersiz değildir; daha ziyade, yeterince benzersizdirler , dolayısıyla bir çarpışma oldukça olası değildir, ancak yine de mümkündür.


8

Bir karma algoritmayı düşünmenin iyi bir yolu, Photoshop'ta bir görüntüyü yeniden boyutlandırmayı düşünmektir ... Diyelim ki 5000x5000 piksellik bir görüntünüz var ve sonra onu yalnızca 32x32 olarak yeniden boyutlandırıyorsunuz. Sahip olduğunuz şey hala orijinal görüntünün bir temsilidir, ancak çok daha küçüktür ve daha küçük boyuta sığması için görüntü verilerinin belirli kısımlarını etkili bir şekilde "atmıştır". Dolayısıyla, 32x32 görüntüyü 5000x5000'e kadar yeniden boyutlandıracak olsaydınız, tüm elde edeceğiniz bulanık bir karmaşadır. Bununla birlikte, 32x32'lik bir görüntü o kadar büyük olmadığından, teorik olarak, aynı pikselleri üretmek için başka bir görüntünün küçültülebileceği düşünülebilir!

Bu sadece bir benzetme ama bir hash'in ne yaptığını anlamaya yardımcı oluyor.


3
Görüntü yeniden boyutlandırma kayıplı bir işlem olsa da, orijinal 5000 × 5000 boyutunda bir görüntü oluşturmak hala oldukça kolaydır ve bu (yeniden küçültme işlevi uygulandığında) aynı 32 × 32 görüntüye düşecektir. İyi bir hash işlevi için böyle bir ön görüntü bulmak zor olmalıdır .
Paŭlo Ebermann

4

Bir hash çarpışması sandığınızdan çok daha olasıdır. Bunun nedenini daha iyi anlamak için doğum günü paradoksuna bir göz atın .


1
2 ^ 8 ile 2 ^ 9 arasında 365 olası doğum günü değeri vardır. 128 bitlik bir karma 2 ^ 128 olası değere sahiptir - 2 ^ 120 kat daha fazla. Evet, çarpışmalar tahmin edebileceğinizden daha olasıdır, ancak yine de astronomik olarak olası değildir.
Tim Keating

Bir hash çarpışmasında iyi bir şansa sahip olmak için yaklaşık 2 ^ 64 farklı değere ihtiyacınız olacak. Hala epeyce.
Paŭlo Ebermann

4

Olası girdi dosyalarının sayısı 128 bitlik çıktıların sayısından daha fazla olduğundan, mümkün olan her birine benzersiz bir MD5 hash atamak imkansızdır.

Veri bütünlüğünü veya dijital imzaları (verimlilik için imzalanan karma) kontrol etmek için şifreleme hash fonksiyonları kullanılır. Bu nedenle, orijinal belgenin değiştirilmesi, orijinal karmanın değiştirilen belgeyle eşleşmediği anlamına gelmelidir.

Bu kriterler bazen kullanılır:

  1. Ön görüntü direnci: belirli bir hash fonksiyonu ve verilen hash için, o fonksiyon için verilen hash'e sahip bir girdi bulmak zor olmalıdır.
  2. İkinci ön görüntü direnci: belirli bir hash fonksiyonu ve girdisi için, aynı hash ile ikinci, farklı bir girdi bulmak zor olmalıdır.
  3. Çarpışma direnci: belirli bir işleve sahip olduğu için, aynı hash ile iki farklı giriş bulmak zor olmalıdır.

Bu kriterler, belirli bir hash ile eşleşen bir belgeyi bulmayı zorlaştırmak için seçilir, aksi takdirde orijinali hash ile eşleşen bir belgeyle değiştirerek belgeleri sahte yapmak mümkün olacaktır. (Değiştirme anlamsız olsa bile, orijinalin yalnızca değiştirilmesi kesintiye neden olabilir.)

3 numara, 2 numarayı ifade eder.

Özellikle MD5'e gelince, kusurlu olduğu gösterilmiştir: MD5 ve diğer hash fonksiyonları nasıl kırılır .


2

Ancak gökkuşağı masalarının devreye girdiği yer burasıdır. Temelde, ayrı ayrı hashing uygulanmış büyük miktarda değerdir ve ardından sonuç diske kaydedilir. Daha sonra, çok büyük bir tabloda arama yapmak için ters çevirme biti "sadece" olur.

Açıkçası, bu yalnızca olası tüm giriş değerlerinin bir alt kümesi için uygulanabilir, ancak giriş değerinin sınırlarını biliyorsanız, onu hesaplamak mümkün olabilir.


Ahh evet. Jeff'in Hash Tables ( codinghorror.com/blog/archives/000949.html ) hakkındaki gönderisini okumaktan zevk aldım ve bu ileti dizisi, kavramın anlaşılmasına yardımcı oldu.
barfoon


2

En çok oylanan yanıtların ne anlama geldiğini anlamanın en iyi yolu aslında MD5 algoritmasını geri döndürmeye çalışmaktır. Birkaç yıl önce MD5crypt algoritmasını geri döndürmeye çalıştığımı hatırlıyorum , orijinal mesajı kurtarmak için değil, çünkü açıkça imkansızdır, sadece orijinal hash ile aynı hash'i üretecek bir mesaj oluşturmak için. Bu, en azından teorik olarak bana, / etc / passwd dosyasında kullanıcı: şifresini orijinal olanı kullanmak yerine oluşturulan mesajı (şifre) kullanarak saklayan bir Linux cihazına giriş yapmam için bir yol sağlayacaktır. Her iki mesaj da aynı sonuçta elde edilen hash'e sahip olacağından, sistem parolamı (orijinal hash'den üretilen) geçerli olarak tanıyacaktır. Bu hiç işe yaramadı. Birkaç hafta sonra, doğru hatırlıyorsam, tuz kullanımıilk mesajda beni öldürdü. Sadece geçerli bir ilk mesaj değil, aynı zamanda asla yapamadığım tuzlu geçerli bir başlangıç ​​mesajı da üretmek zorundaydım. Ama bu deneyden edindiğim bilgi güzeldi.


Verilen MD5 hash değerini makul derecede verimli bir şekilde üreten bir girdi üretebilseydiniz, bu kripto topluluğu için büyük bir anlaşma olurdu ve yayınlanmalıdır. Bu, belirli bir girdinin tuzlanmış olup olmadığından tamamen bağımsızdır.
Dave L.

1

Birçoğunun söylediği gibi, MD5 değişken uzunluktaki veri akışlarının sabit uzunluktaki bir veri yığınına hash edilmesi için tasarlandığından, tek bir karma birçok giriş veri akışı tarafından paylaşılır.

Bununla birlikte, sağlama toplamından orijinal verileri bulmanız gerekirse, örneğin bir şifrenizin karma değerine sahipseniz ve orijinal şifreyi bulmanız gerekiyorsa, genellikle karmayı yalnızca google (veya tercih ettiğiniz arama) için daha hızlıdır. cevap için kaba kuvvet kullanmaktansa. Bu yöntemi kullanarak birkaç şifreyi başarıyla buldum.


0

tanım gereği Hash (kriptografik Hash) fonksiyonu: tersine çevrilemez; çarpışmalara sahip olmamalıdır (en azından mümkün).

Regd sorunuzu: bu tek yönlü bir karmadır. girdi (uzunluğa bakılmaksızın) sabit boyutlu bir çıktı oluşturacaktır (algo'ya göre doldurulacaktır (MD5 için 512 bit sınır)). Bilgi sıkıştırılır (kaybolur) ve ters dönüşümlerden üretilmesi pratik olarak mümkün değildir.

MD5 hakkında ek bilgi: çarpışmalara karşı savunmasızdır. yakın zamanda bu makaleyi inceledik, http://www.win.tue.nl/hashclash/Nostradamus/

kripto hash uygulamaları için (MD5 ve SHA) kaynak kodunu açar Mozilla kodunda bulunabilir. (freebl kütüphanesi).


0

Şimdi bir gün boyunca MD5 karmaları veya bu konu için diğer karmalar, olası tüm dizeler için önceden hesaplanır ve kolay erişim için saklanır. Teoride MD5 tersine çevrilebilir olmasa da, bu tür veritabanlarını kullanarak hangi metnin belirli bir hash değeriyle sonuçlandığını öğrenebilirsiniz.

Örneğin , hash'i hesaplamak için hangi metni kullandığımı öğrenmek için http://gdataonline.com/seekhash.php adresinde aşağıdaki hash kodunu deneyin

aea23489ce3aa9b6406ebb28e0cda430

Ah, evet, sıradan 7 harfli bir kelimenin özeti. Şimdi, boşluk ve noktalama işaretleriyle bu 11 kelimelik şarkı sözlerini bulmak için kullanın: 9f2c08d4e6158bd4854b15be50c8daa8. Birkaç bin yıl sonra görüşürüz.
Tim Keating

6fba2bbab8a8366309bf67c7df12c622? İpucu: Mac OS X'in belirli bir sürümünün OEM sürümü olabilir!
scherand

@Tim Keating, @scherand: Sadece hash algoritmalarının zayıflığına işaret ediyor, çünkü bir dizenin karması her zaman aynıdır, gerçek dizgiyi bulmak için algoritmayı kırmamız gerekmiyor.
Babar

2
Ama söylediğin bu değil. Karmaların "olası tüm dizeler için önceden hesaplandığını ve kolay erişim için depolandığını" söylediniz ki bu açıkça yanlıştır ("tüm olası dizeler" sonsuzdur ... ve hatta "tüm makul dizeler" kümesi bile gerçekten çok büyüktür. ). IMHO bu, makul bir parolaya karşı sözlük saldırısı yapmanın ne kadar kolay olduğunu yanlış gösterir.
Tim Keating

0

f (x) = 1 geri döndürülemez. Karma işlevler geri alınamaz.

Bu aslında , birisinin hash edilmiş verilerin bozulmamış bir kopyasına sahip olup olmadığını belirleme işlevini yerine getirmeleri için gereklidir . Bu, özellikle MD5'e karşı bugünlerde oldukça güçlü olan kaba kuvvet saldırılarına duyarlılık getiriyor.

Burada ve başka yerlerde matematik bilgisi olan ancak şifre kırma bilgisi çok az olan insanlar arasında da kafa karışıklığı var. Birkaç şifre basitçe anahtar akışıyla verileri XOR ve böylece bir şifreli metnin bu uzunluktaki tüm düz metinlere karşılık geldiğini söyleyebilirsin çünkü herhangi bir anahtar akışını kullanmış olabilirsin.

Bununla birlikte, bu, tohumdan üretilen makul bir düz metnin , ikincisinin bir olasılık olduğunu iddia eden herhangi birinin alay edilebileceği ölçüde password, tohum tarafından üretilen bir diğerinden çok, çok daha muhtemel olduğunu göz ardı eder Wsg5Nm^bkI4EgxUOhpAjTmTjO0F!VkWvysS6EEMsIJiTZcvsh@WI$IH$TYqiWvK!%&Ue&nk55ak%BX%9!NnG%32ftud%YkBO$U6o.

Aynı şekilde, iki potansiyel şifre arasında karar vermeye çalışıyorsanız passwordve Wsg5Nm^bkI4EgxUObunu yapmak, bazı matematikçilerin inandığınız kadar zor değil.


En çok şifrenizi nereden alırsınız , verileri anahtar akışı bilgisiyle basitçe XOR ? Bu akış şifreleri için geçerlidir, ancak blok şifreleri de vardır ve bu şekilde çalışmazlar.
Paŭlo Ebermann

-5

Tüm çeşitli argümanları seviyorum. Karma değerlerin gerçek değerinin, parolalar gibi dizeler için insan tarafından okunamayan yer tutucular sağlamak olduğu açıktır. Özel bir gelişmiş güvenlik avantajı yoktur. Bir saldırganın şifreli bir tabloya erişim sağladığını varsayarsak, şunları yapabilir:

  • Tabloda yazma / düzenleme haklarına sahipse, kendi seçtiği bir şifreyi Hash ve sonuçları şifre tablosunun içine yerleştir.
  • Ortak şifrelerin karma değerlerini oluşturun ve şifre tablosunda benzer karma değerlerin varlığını test edin.

Bu durumda, zayıf parolalar yalnızca hash edilmiş oldukları gerçeğiyle korunamaz.


"Karma değerlerin" gerçek değeri, insan tarafından okunamayan yer tutucular sağlamak değildir. "Password1", "newval" olarak karma haline getirildiyse , hash okunabilir ve anlamlı olmasına rağmen, bu yine de değeri benzer bir şekilde gizlemez mi? Dahası, şifreler KÖTÜ bir örnektir çünkü ASLA hashing uygulanmamalıdır. Saldırganın söz konusu veritabanına yazma erişimi olduğunu varsayarsak, bu kesinlikle bir olasılıktır. Bununla birlikte, bu tür karma işlevler için uygun kullanımı yalnızca atıyorsunuz gibi görünüyor, yukarıdaki birçok yanıtta bir örnek özetlenmiştir - mesaj bütünlüğü. Aslında bugün bu konu başlığının nedeni bu.
Shane
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.