MD5 Algoritması Ned...
 
Bildirimler
Hepsini Temizle

MD5 Algoritması Nedir? (güvenlik)  

Onur Serhat Uygur
(@onurserhatuygur)
Üye

MD5 Algoritması Nedir?


MD5
(Message-Digest algorithm 5) aslında bir şifreleme yöntemi değil, bir
hash function‘dır. Yani herhangi bir uzunlukta verilen mesajı (veya
dosyayı) alıp fazla uzun olmayan bir harf ve sayı dizisine çevirir. Siz
700mb büyüklüğünde bir Linux dağıtımının .iso dosyasını indirseniz de,
“merhaba, nasılsın?” mesajı yazsanız da, hepsinin MD5 sonucu 128bit
uzunluğundadır. 128bit ise 128/4 = 32 hexadecimal sayıyla ifade
edilebilir.
Hemen bir örnek verelim: ulusal dağıtımımız olan
Pardus’un .iso dosyasını bu klasörde görüyorsunuz. Bakalım bu
klasördeki pardus-1.0.iso.md5sum dosyasında ne yazıyor:
c84f093c22580a70813dff7d0e9c85bf pardus-1.0.iso
Buradaki
32 tane hexadecimal sayı (0-f arası karakterler) pardus-1.0.iso
dosyasının MD5 sonucunu gösteriyor. Eğer siz bu 700mb’lık dosyayı
bilgisayarınıza indirirken 1 bit’lik bile hata yapmış olsaydınız MD5
sonucu çok farklı bir sayı çıkardı! Wikipedia örneğinde cümlede tek
harf değişince MD5 sonucu da alakasız biçimde değişiyor:
MD5(”The quick brown fox jumps over the lazy dog“)
= 9e107d9d372bb6826bd81d3542a419d6
MD5(”The quick brown fox jumps over the lazy cog“)
= 1055d3e698d289f2af8663725127bd4b
Tek Yönlü Şifreleme Algoritmaları
Bir
algoritmanın tek yönlü şifreleme algoritması olarak kabul edilebilmesi
için tabii ki şifrelenmemiş veriye kolayca ulaşmamamız gerekli. Çift
yönlü şifreleme algoritmaları encrypt ve decrypt fonksiyonları
yardımıyla bir mesajı şifreler ve şifresini çözerler. Ancak, örnek
olarak MD5 için bir decryption function yazmak mümkün değildir.
128
bit’lik c84f093c22580a70813dff7d0e9c85bf MD5 hash’ini kullanarak
pardus-1.0.iso dosyasını oluşturmamız mümkün değildir. Ancak MD5
kullanılarak kaydedilmiş şifreleri bulmak için uygulanabilecek bazı
yöntemler mevcut.
MD5′e Brute Force Saldırılar
Brute Force
saldırılar kabaca, tüm olasılıkları deneyerek şifreyi çözmek olarak
anlatılabilir. Örnek olarak elinizde c84f093c22580a70813dff7d0e9c85bf
MD5 sonucu var, ve siz bunun 6 basamaklı bir sayının MD5 sonucu
olduğunu tahmin ediyorsunuz. Yapılacak işlem basit: 6 basamaklı tüm
sayıların MD5 sonucuyla elimizdeki sonucu karşılaştırmak! Basit bir
kodla bu işlem halledilebilir
for( int i=100000; i!=1000000; i++ )
if( MD5(i) == “c84f093c22580a70813dff7d0e9c85bf” )
print( “Şifre bulundu: ” + i);
Yukarıdaki
döngü milisaniyeler içinde tamamlanıp, eğer varsa, sonucu
listeleyecektir. Ancak tabii ki şifre 6 basamaklı bir sayı olacak
varsayımını her zaman yapmamız mümkün değildir. Şifrelerde büyük
harfler [A-Z], küçük harfler [a-z], rakamlar [0-9], özel karakterler
[!@#$%^&*()-_+=], veya dile özel karakterler [ıçşüğâî] bulunabilir.
Uzunlukları ve karakter tipleri belli olmayan bir şifre için brute
force saldırı uygulamak tahmin ettiğinizden de uzun sürebilir
(milyarlarca yıl mesela). Bu yüzden bazı karakter setleri için MD5
şifreleri tabloları hazırlanır.
MD5 Tabloları ve RainbowCrack Projesi
Biraz
önce dediğimiz gibi; MD5 şifrelerini kolayca eşleştirmek için
tanımlayacağımız karakter setindeki belli uzunluklarda tüm
olasılıkların MD5 sonucunu bir tabloya atmak, bu eşleştirmeyi birkaç
saniye içinde tamamlamak anlamına geliyor. Yalnız bu tabloları
oluşturmak için güçlü bir bilgisayara (veya paralel bilgisayarlara),
geniş bir disk alanına ve gerekiyorsa uzun zamana ihtiyacınız
olacaktır. Bir kez tabloyu oluşturduğunuzda vereceğiniz herhangi bir
MD5 sonucunu eşleştirmek gayet hızlı olacaktır. RainbowCrack
projesinden birkaç örnekle konuyu açıklayalım:
Örnek #1
karakter seti   [ABCDEFGHIJKLMNOPQRSTUVWXYZ]
şifre uzunluğu   1-14
olasılık   8353082582
tablo boyutu   610 MB
Örnek #2
karakter seti   [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]
şifre uzunluğu   1-14
olasılık   80603140212
tablo boyutu   3 GB
Örnek #3
karakter seti   [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+= ]
şifre uzunluğu   1-14
olasılık   915358891407 (2^39.7)
tablo boyutu   24 GB
Bu
tablolar içinden bir windows şifresi saniyeler içinde bulunabiliyor.
Windows şifrelemesi için büyük harflerden oluşan karakter setleri küçük
harfleri de kırabildiği için ayrıca küçük harfler eklenmemiş.
Örnek #4
karakter seti   [abcdefghijklmnopqrstuvwxyz0123456789]
şifre uzunluğu   1-8
olasılık   2901713047668
tablo boyutu   36 GB
Yukarıdaki
örnekte ise tablo MD5 için hazırlanmış ve karakter seti küçük
harflerden ve rakamlardan oluşmaktadır. Verilen MD5 sonucu birkaç
dakika içinde eşleştirilip %99.9 ihtimalle bulunabiliyor.
Bu MD5
tablosunda karakter setine büyük harfler ve özel karakterler
eklendiğinde tablo boyutu terabaytlar düzeyine çıkacak; 9 ve 10
karakter uzunluğundaki şifreleri de kapsamasını istersek hem tablonun
oluşturulması aylar belki yıllar sürecek, hem de boyutu
düşünemeyeceğimiz kadar büyük olacaktır.
İnternette MD5 şifrelerinin
ne olduğunu sorabileceğiniz birkaç veritabanı mevcut. Ne kadar yasal
bir uygulamadır tartışılır tabii ki ama vermek için bir sakınca
görmüyorum:
•   MD5 Reverse Lookup
•   MD5();
Sayın Ferruh Mavituna da güzel ve kapsamlı bir liste hazırlamış, iyisi mi siz bu listeden yararlanın.
İnternet Uygulamalarında MD5 Kullanarak Daha Güvenli Şifre Saklama
Sıklıkla
takip ettiğimiz fazlamesai.net sitesinde temmuz ayı sonunda bir açık
bulunmuş ve tüm veritabanına erişilmişti. Veritabanında şifreler tabii
ki açıkça yazmıyor, veya geri dönüşümü olan bir şifre algoritmasından
geçirilmiyordu. Kullanılan algoritma MD5 olmasına rağmen tabii ki
kimsenin içi rahat değildi; çünkü artık MD5 şifreleri internetteki MD5
lookup table‘lar sayesinde kolayca eşleştirilebiliyordu. Bir saldırının
anatomisi: Fazlamesai yazısını ve yorumlarını okuyacak olursanız
güvenlikle ilgili faydalı bilgiler edinebilirsiniz.
MD5 şifrelerini
sağlamlaştırmak için insanların akıllarına ilk gelen yöntem MD5
sonuçlarını tekrar tekrar MD5′ten geçirmek olmuş. Yani veritabanına
kaydederken md5(şifre) yerine md5(md5(md5(şifre))) olarak kaydetmeye
başlamışlar. Ancak dikkat edin, bu yöntemle şifrenizin bulunma zamanını
ve RainbowCrack tablosunun uzunluğunu exponential değil linear büyütmüş
olursunuz!
Şifreleri daha güvenli saklamak için MD5′ten geçirmeden önce aldığınız karakter dizisine bazı işlemler uygulayın. Mesela:
•   Şifreyi reverse edin, normaliyle birleştirin.
•   Şifrenin ilk veya son birkaç karakterini başa veya sona ekleyin.
•   Şifrenin başına ve sonuna farklı karakter setlerinden belirleyeceğiniz karakterleri ekleyerek şifreyi uzatın.
Uygulama
Gelin,
isterseniz bir uygulama yapalım. Diyelim ki elimizdeki şifre 1234
(sanırım insanların %10′u filan bu şifreyi kullanır). İsterseniz bu
şifreyi MD5 sonucundan nasıl rahat bulabildiğimize bakalım:
md5(1234) = 81dc9bdb52d04dc20036dbd8313ed055
Şifremiz
4 basamaklı bir sayı, demek ki 1′den 4 basamağa kadar olan sayıların
MD5 hash’lerini bulup karşılaştırsak şifreyi bulabilecekmişiz. Olasılık
sayısı (9^1)+(9^2)+(9^3)+(9^4) = 7380. İşlemcinin yorulduğuna bile
değmez… Zaten bu şifrenin nasıl kolayca eşleştiğini buradan ve buradan
kontrol edebilirsiniz.
Şimdi ise şifremizi MD5 fonksiyonuna sokmadan önce birkaç işlem uygulayalım:
•   Öncelikle şifreyi ters çevirin: 4321
•   Başına birkaç sayı ve karakter ekleyin (mesela 0a4b): 0a4b4321
•   Son iki karakterini alıp başa ekleyin: 210a4b4321
•   Başına ve sonuna büyük-küçük harfler ve özel karakterler ekleyin
(mesela başına 2%t}W, sonuna da a(H_5$ gibi…) : 2%t}W210a4b4321a(H_5$
•   Şimdi ise bu karakter dizisini MD5 fonksiyonundan geçirin:
md5(2%t}W210a4b4321a(H_5$) = f56ae31a4ebd33c0fee2054f9567d201
Bu
hash değerini internetteki veritabanlarının bulmasının imkanı yok! Hem
20 karakterli, hem de çoğu karakter setinden harfler içeriyor. Hoş,
biri bulsa bile 2%t}W210a4b4321a(H_5$ diye bir şifre hiçbir işine
yaramayacaktır. Burada önemli olan,
•   Aldığınız şifreyi her zaman aynı basamaklardan geçirerek kontrol etmek,
•   Bu basamakları gizli tutmak.


Böylece kullanıcılarınızın şifrelerini daha güvenli saklayabilirsiniz
.

Kaynak:ceh 

Alıntı
Topic starter Gönderildi : 24/02/2008 23:55
Paylaş: