Güvenli MD5 Kullanımı

ServerErr0r

uid=0(root)
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 #1karakter seti [ABCDEFGHIJKLMNOPQRSTUVWXYZ]
şifre uzunluğu 1-14
olasılık 8353082582
tablo boyutu 610 MB


Örnek #2karakter seti [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]
şifre uzunluğu 1-14
olasılık 80603140212
tablo boyutu 3 GB


Örnek #3karakter 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 #4karakter 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.
 
Üst