bütün web programcıların dertlerinden birisidir şifreleri saklamak.. sadece şifre değil, kullanıcılardan alınan tüm önemli bilgilerin (kimlik numarası gibi) şifrelenerek saklanması gerekmektedir.. hemen her programcı da bu işlem için ya md5() ya da sha1() fonksiyonlarını kullanır.. bazı kişiler md5(md5($veri)) gibisinden kullanıma da gider.. ya da md5(sha1($veri)) olarak kullanırlar.. tabii tersi de mümkün.. işi abartıp, 10 tane md5′i iç içe yazanlar da yok değil.. ancak en iyi şifreleme yöntemi, kendi üreteceğin şifreleme algoritmasıdır..
md5() ve sha1() fonksiyonlarının geri dönüşümü yoktur.. ancak çözülmeyecek değillerdir.. bazı siteler, daha önce girilmiş olan basit kelimelerin karşılıklarını veriyorlar.. siz bir md5 çıktısını yapıştırdığınızda, size asıl kelimeyi veriyorlar.. aşağıda bir örnek var.. site adresini vermeyeceğim tabii :)

burada görüldüğü gibi, şifrenizi 123456 olarak girerseniz, md5 ile bir defa şifrelense de, şifrenizi ele geçirebilirler.. tabii bu biraz da programcının uyguladığı şifrelemeye bakıyor :)
şimdi, çok basit bir veri şifreleme örneği vereceğim.. bu şekilde verileriniz bir parça daha güvenli olacaktır.. açıklamaları zaten kodun içerisinde var..
function sifre_sifre($sifre)
{
// şifremizi md5 ile şifreleyelim..
$sif_1 = md5($sifre);
// bir de sha1 ile şifreleyelim..
$sif_2 = sha1($sifre);
/*
2 farklı şekilde şifrelenmiş olan şifremizden, bir tane şifre oluşturalım..
oluştururken, md5 den bir tane, sha1 den bir tane olacak şekilde, 4er tane
olacak şekilde, rastgele basamaklar kullanalım..
*/
$karistir = $sif_1[4].$sif_2[1].$sif_1[10].$sif_2[9].$sif_1[30].$sif_2[15].$sif_1[20].$sif_2[11];
// son olarak da karışmış olan şifreyi md5 den geçirelim..
return md5($karistir);
}
// kullanımı:
$sifre = sifre_sifre($sifre);
tabii bunu aynen bu şekilde kullanmak olmaz.. kendinize göre düzenleyip, biraz da ek yapmak daha sağlıklı olur.. peki bu kodun avantajı nedir?
örnek olarak, kullanıcın şifresini 123456 şeklinde belirlediğini varsayalım.. normalde veritabanında tek bir md5() uygulanmış şifremiz e10adc3949ba59abbe56e057f20f883e olarak gözükecektir.. sha1() uygulanmış hali ise 7c4a8d09ca3762af61e59520943dc26494f8941b şeklinde.. birileri veritabanınızı ele geçirir ve şifreleri kırmayı başarırsa göreceği şifreniz de yine 123456 olacaktır.. ki bunu istemeyiz..
oysa, yukarıdaki fonksiyonu kullanırsak, kişinin bulabileceği şifre 8 haneli olacak.. 123456 için çıkacak sonuç ise dcba3fe7 olacaktır.. böylece şifrelerimizi çalmış kişiyi yanıltmış olacağız :) o kadar uğraş boşa gidecek, yazık olacak :)
3 yorum yapılmış...
chelishky - 29 Mart 2010 @ 18:35.25
Mantıklı bir yaklaşım,basit bir sistemde bunu uygulayıp daha sonra kırmak için denemeler yapacam bakalım ne olacak =).Tabi db’den hash’li pass’ları alabilmelerini engellemek daha iyi bir yaklaşım bence.get_magic_quotes_gpc,stripslashes vs vs..İyi bloglar =)
[cevapla]
lestioni - 29 Mart 2010 @ 18:42.13
Asıl şifreye bu sistemle hiçbir şekilde ulaşamazsın. Zira asıl şifre kaç karakter olursa olsun, burada biz 8 haneli yeni bir şifre oluşturuyoruz. Üstelik oluştururken de, şifrenin şifrelenmiş halinden rastgele basamaklar alıp kullanıyoruz. En son paragrafa bakarsan zaten olay orada bitiyor.
[cevapla]
chelishky - 29 Mart 2010 @ 20:17.37
Evet aslında reassembly gibi bir mantık yürütmüştüm ama md5 asimetrik şifreleme yaptığı için alakasız karakterler çıkacak.Dolayısı ile bu algoritmayı kullanıp brute force ile şifre karşılaştırarak ancak kırılabilir.O da epey uzun sürer,mantıksız bir saldırı olur :/.
[cevapla]