MD5 ve Çözümü ...
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 53
- Kayıt: 01 Haz 2005 11:47
MD5 ve Çözümü ...
Selamlar,
MD5'in geri dönüşümsüz bir fonksiyondan oluşması ve geriye dönülemez (kırılamaz) olduğunu falan bildiğimizi varsayalım.
Şimdi yapmak istediğim,
a..z, A..Z, 1..9 harflerinin (yani tüm karakterlerin ) tüm kombinasyonlarını VE bu her bir kombinasyonun hash'ini SQL Server'a kayıt etmek.
"Tümünü kayıt edemezsin o kadar diski nerden bulucan" falan kısımlarını geçelim, tümünü kayıt edemeyeceğimi elbette biliyorum ama en azından mümkün olduğunca kayıt etmek istiyorum.
Örneğin sadece (a..z , 1..9) karakterlerini kapsayan ve 1 ile 7 rakam arasındaki hash'leri bulmak mümkün olabilir. Hesaplayabildiğim kadarıyla bunun 80.603.140.212 adet varyasyonu olacak. (80 milyar diyelim)
Şu anda ise elimde database için kullanabileceğim yaklaşık 5 Terabyte diskim var.
1. SQL Server ya da FireBird konusunda kararsızım.
2. Ne kadar diske ihtiyacım olabileceğini hesaplamak mümkün mü ?
3. Genel olarak bana sunabileceğiniz tüm önerilere de ayrıca açığım.
4. 80 milyar kayıt hayal mi ?
Teşekkürler ve iyi çalışmalar.
MD5'in geri dönüşümsüz bir fonksiyondan oluşması ve geriye dönülemez (kırılamaz) olduğunu falan bildiğimizi varsayalım.
Şimdi yapmak istediğim,
a..z, A..Z, 1..9 harflerinin (yani tüm karakterlerin ) tüm kombinasyonlarını VE bu her bir kombinasyonun hash'ini SQL Server'a kayıt etmek.
"Tümünü kayıt edemezsin o kadar diski nerden bulucan" falan kısımlarını geçelim, tümünü kayıt edemeyeceğimi elbette biliyorum ama en azından mümkün olduğunca kayıt etmek istiyorum.
Örneğin sadece (a..z , 1..9) karakterlerini kapsayan ve 1 ile 7 rakam arasındaki hash'leri bulmak mümkün olabilir. Hesaplayabildiğim kadarıyla bunun 80.603.140.212 adet varyasyonu olacak. (80 milyar diyelim)
Şu anda ise elimde database için kullanabileceğim yaklaşık 5 Terabyte diskim var.
1. SQL Server ya da FireBird konusunda kararsızım.
2. Ne kadar diske ihtiyacım olabileceğini hesaplamak mümkün mü ?
3. Genel olarak bana sunabileceğiniz tüm önerilere de ayrıca açığım.
4. 80 milyar kayıt hayal mi ?
Teşekkürler ve iyi çalışmalar.
-
- Kıdemli Üye
- Mesajlar: 1026
- Kayıt: 11 Şub 2005 02:12
- Konum: İstanbul
while md5(donguileolusturulandeger) <> strMd5 do
begin
//bir sonraki kombinasyonu oluştur.....
end;
Şeklinde md5 ile şifrelenmiş bir değeri bulabilirsin. Ancak md5 in kırılmamazlığı buradan gelmiyor. Bunun sebebi çok farklı verilerin md5 değerlerinin aynı olabileceğidir. Yani sen kaba kuvvetle bir değer bulsan bile bu asıl şifrelenen değer olmayabilir. 1 GB lık dosyayı veya 10 harflik bir kelimeyi şifrele, md5 herzaman aynı uzunlukta bir değer döndürecektir.
begin
//bir sonraki kombinasyonu oluştur.....
end;
Şeklinde md5 ile şifrelenmiş bir değeri bulabilirsin. Ancak md5 in kırılmamazlığı buradan gelmiyor. Bunun sebebi çok farklı verilerin md5 değerlerinin aynı olabileceğidir. Yani sen kaba kuvvetle bir değer bulsan bile bu asıl şifrelenen değer olmayabilir. 1 GB lık dosyayı veya 10 harflik bir kelimeyi şifrele, md5 herzaman aynı uzunlukta bir değer döndürecektir.
-
- Üye
- Mesajlar: 53
- Kayıt: 01 Haz 2005 11:47
Bilgi için teşekkürler,Ali Erdoğan yazdı:while md5(donguileolusturulandeger) <> strMd5 do
begin
//bir sonraki kombinasyonu oluştur.....
end;
Şeklinde md5 ile şifrelenmiş bir değeri bulabilirsin. Ancak md5 in kırılmamazlığı buradan gelmiyor. Bunun sebebi çok farklı verilerin md5 değerlerinin aynı olabileceğidir. Yani sen kaba kuvvetle bir değer bulsan bile bu asıl şifrelenen değer olmayabilir. 1 GB lık dosyayı veya 10 harflik bir kelimeyi şifrele, md5 herzaman aynı uzunlukta bir değer döndürecektir.
Sizin anlattığınız brute force'a benziyor ancak benim yapmak istediğim yukarıda da anlattığım gibi bir tabloya (şifreler için düşünelim) her bir kelimenin kendisini ve hash değerini yazmak. (kayıtsız koşulsuz ve a'dan z'ye...)
Sonra kullanıcı (internetten sorgu yapan bir kullanıcı) örneğin "0217a9bae01597d596af405b4c723017" değerini girdiğinde ben database'den sorgulama yaparak kendisine "a14zhq9" değerini döndüreceğim.
Bir de yazınızdan anladığıma göre, hash değerleri aynı olan farklı kelimeler olabilir diyorsunuz öyle mi ?
yani diyelim ki ahmet : "cdb5efc9c72196c1bd8b7a594b46b44f"
iken mehmet de "cdb5efc9c72196c1bd8b7a594b46b44f" değerine sahip olabilir mi ?
-
- Kıdemli Üye
- Mesajlar: 1026
- Kayıt: 11 Şub 2005 02:12
- Konum: İstanbul
Senin yaptığın da bir nevi kaba kuvvet, ancak senin yaptığın şekli ile avantaj sağlayabilmek için sözlükler kullanabilir ve t9 sözlüklerinde bulunan sözcüklerin md5 değerlerini kaydederek yaygın kelimelerin md5 eşleştirmelerini buldurabilirsin. Diğer türlü hız açısından çok bariz bir fark olmayacaktır. Hatta döngü yöntemi hızlı bile olabilir. Bir dosyayı okuyarak karşılaştırma yapmaktansa ramde değişkenler üretip karşılaştırma yapmak daha kullanışlı olabilir.Sizin anlattığınız brute force'a benziyor ancak benim yapmak istediğim yukarıda da anlattığım gibi bir tabloya (şifreler için düşünelim) her bir kelimenin kendisini ve hash değerini yazmak. (kayıtsız koşulsuz ve a'dan z'ye...)
Sonra kullanıcı (internetten sorgu yapan bir kullanıcı) örneğin "0217a9bae01597d596af405b4c723017" değerini girdiğinde ben database'den sorgulama yaparak kendisine "a14zhq9" değerini döndüreceğim.
Bir de yazınızdan anladığıma göre, hash değerleri aynı olan farklı kelimeler olabilir diyorsunuz öyle mi ?
yani diyelim ki ahmet : "cdb5efc9c72196c1bd8b7a594b46b44f"
iken mehmet de "cdb5efc9c72196c1bd8b7a594b46b44f" değerine sahip olabilir mi ?
MD5 kodlarının aynı olması ahmet, mehmet gibi harfleri farklı uzunlukları aynı kelimeler için neredeyse imkansızdır. Ancak md5 kullaran cigabaytlarca büyüklüğünde dosyaların dahi kodlarını alabilirsin. Olasılıksal olarak baktığında kodları eşit olan metinler olmak zorunda. Diğer türlü sonsuz varyosyana sahip metinleri sonlu bir permütasyona sahip 32 haneli bir koda tekrarsız bir şekilde eşitlemek mümkün değil.
-
- Üye
- Mesajlar: 53
- Kayıt: 01 Haz 2005 11:47
Ali Erdoğan yazdı:Senin yaptığın da bir nevi kaba kuvvet, ancak senin yaptığın şekli ile avantaj sağlayabilmek için sözlükler kullanabilir ve t9 sözlüklerinde bulunan sözcüklerin md5 değerlerini kaydederek yaygın kelimelerin md5 eşleştirmelerini buldurabilirsin. Diğer türlü hız açısından çok bariz bir fark olmayacaktır. Hatta döngü yöntemi hızlı bile olabilir. Bir dosyayı okuyarak karşılaştırma yapmaktansa ramde değişkenler üretip karşılaştırma yapmak daha kullanışlı olabilir.Sizin anlattığınız brute force'a benziyor ancak benim yapmak istediğim yukarıda da anlattığım gibi bir tabloya (şifreler için düşünelim) her bir kelimenin kendisini ve hash değerini yazmak. (kayıtsız koşulsuz ve a'dan z'ye...)
Sonra kullanıcı (internetten sorgu yapan bir kullanıcı) örneğin "0217a9bae01597d596af405b4c723017" değerini girdiğinde ben database'den sorgulama yaparak kendisine "a14zhq9" değerini döndüreceğim.
Bir de yazınızdan anladığıma göre, hash değerleri aynı olan farklı kelimeler olabilir diyorsunuz öyle mi ?
yani diyelim ki ahmet : "cdb5efc9c72196c1bd8b7a594b46b44f"
iken mehmet de "cdb5efc9c72196c1bd8b7a594b46b44f" değerine sahip olabilir mi ?
MD5 kodlarının aynı olması ahmet, mehmet gibi harfleri farklı uzunlukları aynı kelimeler için neredeyse imkansızdır. Ancak md5 kullaran cigabaytlarca büyüklüğünde dosyaların dahi kodlarını alabilirsin. Olasılıksal olarak baktığında kodları eşit olan metinler olmak zorunda. Diğer türlü sonsuz varyosyana sahip metinleri sonlu bir permütasyona sahip 32 haneli bir koda tekrarsız bir şekilde eşitlemek mümkün değil.
Teşekkürler.
Acaba benim anlamadığım bir nokta mı var ?
Çünkü döngü derken neden bahsettiğinizi anlamıyorum.
Olayı daha da basitleştirirsek sadece "a..z" arasındaki 5 haneli tüm kelime kombinasyonlarını zaten önceden database'e kayıt etmiş durumdayım. (olacağım)
Yani database'imde sadece 12.356.630 adet kelime ve bu kelimelerin de hash değeri bulunuyor.
Bir kişi "cdb5efc9c72196c1bd8b7a594b46b44f" değerini sorduğunda ben database'den
select kelime from database where hash='cdb5efc9c72196c1bd8b7a594b46b44f' diyeceğim ve kayıt gelecek.
Yani kişi sorgulama yaptığında bir döngü kullanmıyor olacağım.
Elbette ben tüm olasılıkları hazırlayıp, bunların hash değerini database'e kayıt ederken "bir defalığına" döngüler falan kullanıyorum tabi ama bunlar kullanıcıyı etkilemiyor.
Kullanıcı bu sayede maksimum 5 karakter olan ve küçük harflerden oluşan hash değerlerinin "karşılık kelimesini" anında bulmuş olacak.
Bu arada ben bu yazıları yazarken, programı bitirmiş oldum ve "a....z , 0 ... 9" karakterlerini barındıran maksimum 7 haneli kelime kombinasyonlarını bir text dosyaya yazdırıyorum.
7 harfli tüm kelimeler bitince bunları database'e import edeceğim ve bir döngü ile baştan sonra hash değerlerini de buldurup yine database'e kayıt edeceğim.
Deneme olma açısından sadece "a..z, 0..9 karakterlerini barındıran maksimum 7 karakterli" kombinasyonları buluyorum.
Bu sayede hem sistemi test etmiş, hem de 8,9,10... haneli ihtimaller için hazırlık yapmış, hem de ihtiyacım olan disk boyutunu hesaplayabileceğim.
Bu arada imkansız olmadığını ama ZOR olduğunu belirteyim.
Şu rakamlar örnek olacaktır

İngiliz alfabesindeki 26 küçük harf ve
İngiliz alfabesindeki 26 büyük harf ve
0..9 arasındaki 10 adet rakamları kullanırsak toplamda
853.058.371.866.182.000 kombinasyon !
Bu arada sonradan gelen bir edit :
a...z,0...9 karakteriyle maksimum 7 karakterli kelimelerin bulunması için bile sanırım program bir kaç gün ( belki bir iki hafta ) çalışacak gibi duruyor ... Hadi hayırlısı

MD5 ile oluşturulan hashlerin karakter sayısı sabit, yani tüm olasılıklar sayılabilecek kadar. Fakat MD5 fonksiyonuna girecek veriler sonsuz tane çünkü karakter sayısında bir kısıtlama yok.delphi_programmer yazdı:hash değerleri aynı olan farklı kelimeler olabilir diyorsunuz öyle mi ?
yani diyelim ki ahmet : "cdb5efc9c72196c1bd8b7a594b46b44f"
iken mehmet de "cdb5efc9c72196c1bd8b7a594b46b44f" değerine sahip olabilir mi ?
MD5 sonsuz bir kümeyi sonlu bir kümeye eşliyor ve bu yüzden 1-1 olamaz.
Aynı hash'e sahip birden fazla girdi kesinlikle olur.
-
- Üye
- Mesajlar: 53
- Kayıt: 01 Haz 2005 11:47
t-hex yazdı:MD5 ile oluşturulan hashlerin karakter sayısı sabit, yani tüm olasılıklar sayılabilecek kadar. Fakat MD5 fonksiyonuna girecek veriler sonsuz tane çünkü karakter sayısında bir kısıtlama yok.delphi_programmer yazdı:hash değerleri aynı olan farklı kelimeler olabilir diyorsunuz öyle mi ?
yani diyelim ki ahmet : "cdb5efc9c72196c1bd8b7a594b46b44f"
iken mehmet de "cdb5efc9c72196c1bd8b7a594b46b44f" değerine sahip olabilir mi ?
MD5 sonsuz bir kümeyi sonlu bir kümeye eşliyor ve bu yüzden 1-1 olamaz.
Aynı hash'e sahip birden fazla girdi kesinlikle olur.
Hımm evet doğru söylüyorsunuz,
Sonuç olarak bilmem kaç gb'lık ISO dosyasının bile hash değeri sadece 128 bitlik bir sayı olabiliyorsa kesinlikle aynı hash değerlerine sahip olan değerler olacaktır.
Beyin fırtınası yapalım.
Kullanıcı HASH'i bana verdi ve ben SQL'den select ettim.
Sonuç olarak belki geriye 1000 tane bile kayıt dönebilir demektir bu durumda.
Aslında şöyle demek daha doğru olur.
Şu anda a ... z , 0 ... 9 max. 7 karakterleri çıkartıyorum ve hash'lerini almaya başlayacağım bitince.
Oradan bakar aynı hash değerine sahip olanların sayısı konusunda falan kabaca bir bilgilenmiş oluruz.
Sanırım bu benim yaptığım çalışma sonucunda çok fazla aynı hash değerine sahip girdi olmayacaktır.
Teşekkürler.
-
- Üye
- Mesajlar: 53
- Kayıt: 01 Haz 2005 11:47
a..z , 0 .. 9 karakter setini kullanarak 1'den 7'ye kadar olanları halen text dosyaya yazmaya devam ediyorum.
Ancak sanırım 1-2 ay sürecek gibi.
Şu anda program 6 basamaklı olanların sonlarına yaklaştı. (p4bt0m)
Dolayısı ile test etmek için 7 haneli değişmiştik, biz onu 6 yapalım
Sırf test etmek için 6 karakter yeter bence
6 karakterli olan tüm kombinasyonlar bulununca text file dosya boyutum : 12,8 GB. olacak.
6 Karakterlilerin kalan kısmının da bitmesi sanırım 1-2 günü bulur.
Bitince bilgilendiririm
Ancak sanırım 1-2 ay sürecek gibi.
Şu anda program 6 basamaklı olanların sonlarına yaklaştı. (p4bt0m)
Dolayısı ile test etmek için 7 haneli değişmiştik, biz onu 6 yapalım

Sırf test etmek için 6 karakter yeter bence

6 karakterli olan tüm kombinasyonlar bulununca text file dosya boyutum : 12,8 GB. olacak.
6 Karakterlilerin kalan kısmının da bitmesi sanırım 1-2 günü bulur.
Bitince bilgilendiririm

benım fikrim şöle
örn diyelim
123456789
et sadece bu rakamları kualnarak 512 tane farklı sayı elde edeliriz tam saydıysam
şimdi bi programa bunu yap ve yayınla isteriyorsan yayınlama
senin secenegin
sonra su guncelleştirme kontrol sistemini ekle
ve sen 1234567890 ı yapınca 1024 olur yanı bi tane daha 512 ekler
bölece yavas yavas sorunları halldetmiş olursun
örn 1234 ve 4321 hashları aynı olsun web programlamada da guvenlik olarak md5 şifrelemesini secsin
adamın asıl şifresi 1234 ken 4321 yazdımı girer mi bilmiyorum bunu arastırmak lazım
örn diyelim
123456789
et sadece bu rakamları kualnarak 512 tane farklı sayı elde edeliriz tam saydıysam
şimdi bi programa bunu yap ve yayınla isteriyorsan yayınlama

sonra su guncelleştirme kontrol sistemini ekle
ve sen 1234567890 ı yapınca 1024 olur yanı bi tane daha 512 ekler
bölece yavas yavas sorunları halldetmiş olursun

bu laf ilgimi cekti ama o zmn şöel bir sey olurAynı hash'e sahip birden fazla girdi kesinlikle olur.
örn 1234 ve 4321 hashları aynı olsun web programlamada da guvenlik olarak md5 şifrelemesini secsin
adamın asıl şifresi 1234 ken 4321 yazdımı girer mi bilmiyorum bunu arastırmak lazım
-
- Üye
- Mesajlar: 53
- Kayıt: 01 Haz 2005 11:47
Evet aynı hash'e sahip girdiler olacaktır.
Ve aynen dediğiniz gibi.
Eğer 1234'ün hash'i 4321 ile aynıysa bu iki şifre aynı sonucu verecektir.
Tabi böyle basit ve kısa uzunluktaki değerler için aynı hash'lerin çıkması kolay değildir.
Bahsettiğiniz yöntem (sadece sayıları hesaplamak) işin kolay yanı zaten.
Şu anda a...z , 0..9 arasındaki 1..6 karakterler arasındakileri çözüyorum.
Toplam olarak 2.238.976.116 farklı ihtimal var :
(36^1)+(36^2)+(36^3)+(36^4)+(36^5)+(36^6)
http://www.google.com.tr/search?hl=tr&q ... 6%29&meta=
Şu anda 12,8 GB'lık kombinasyon verisinin 10,6 GB. lık kısmı diske yazıldı.
Sanırım sabah vakitlerinde kalan ihtimaller de dosyaya yazılmış olacaktır.
Sonrasındaki adım ise :
Bu verileri database'e import etmek.
Sonrasında ise
Baştan başlayarak sona doğru saydırmak ve her birinin hash'ini hesaplayıp database'e yazdırmak.
Gelişmeleri yine buradan aktaracağım.
Teşekkürler.
Bu forum başlığı da "sevgili günlük" misali oldu ama hadi hayırlısı ...
Ve aynen dediğiniz gibi.
Eğer 1234'ün hash'i 4321 ile aynıysa bu iki şifre aynı sonucu verecektir.
Tabi böyle basit ve kısa uzunluktaki değerler için aynı hash'lerin çıkması kolay değildir.
Bahsettiğiniz yöntem (sadece sayıları hesaplamak) işin kolay yanı zaten.
Şu anda a...z , 0..9 arasındaki 1..6 karakterler arasındakileri çözüyorum.
Toplam olarak 2.238.976.116 farklı ihtimal var :
(36^1)+(36^2)+(36^3)+(36^4)+(36^5)+(36^6)
http://www.google.com.tr/search?hl=tr&q ... 6%29&meta=
Şu anda 12,8 GB'lık kombinasyon verisinin 10,6 GB. lık kısmı diske yazıldı.
Sanırım sabah vakitlerinde kalan ihtimaller de dosyaya yazılmış olacaktır.
Sonrasındaki adım ise :
Bu verileri database'e import etmek.
Sonrasında ise
Baştan başlayarak sona doğru saydırmak ve her birinin hash'ini hesaplayıp database'e yazdırmak.
Gelişmeleri yine buradan aktaracağım.
Teşekkürler.
Bu forum başlığı da "sevgili günlük" misali oldu ama hadi hayırlısı ...