MD5 ve Çözümü ...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

MD5 ve Çözümü ...

Mesaj gönderen delphi_programmer »

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.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Çok iyi bir yöntem değil bence ama denemekte fayda var : ) Bu tarz işlemleri genelde cpu cache'de yapıyorlar.

firebird...

Kolay gelsin.
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Mesaj gönderen Ali Erdoğan »

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.
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

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.
Bilgi için teşekkürler,

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 ?
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Mesaj gönderen Ali Erdoğan »

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 ?
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.

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.
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

Ali Erdoğan yazdı:
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 ?
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.

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ı :)
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

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 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.

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.
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

t-hex yazdı:
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 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.

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.
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

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 :)
lodos
Üye
Mesajlar: 28
Kayıt: 29 Ara 2006 10:32

Mesaj gönderen lodos »

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 ;)


Aynı hash'e sahip birden fazla girdi kesinlikle olur.
bu laf ilgimi cekti ama o zmn şöel bir sey 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
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

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ı ...
Cevapla