MD5 ve Güvenli Kullanımı

CyBeR-Security

Yeni üye
22 Şub 2008
8
0
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: ScriptSide ismini md5 ile gizledğimizde bize böyle bir değer veriyor 9c164a336b93780d96da74c2cae14507

Buradaki 32 tane hexadecimal sayı (0-f arası karakterler) scriptside yazısının MD5 sonucunu gösteriyor. 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 scriptside yazısı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

* http://cwyi%20taklid%20etmeye%20çalışan%20turkish%20mallar%20timio.org/?category=main&page=homeMD5 Reverse Lookup[/URL]
* MD5();

Buradan daha fazla sonuca ulasabilirsiniz

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

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

, son günlerde sık rastlanan sorunlara yararlı olabileceğini düşündüm.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.