PHP Scripting ile Web Güvenliği
Güvenli Şifreleme:
Güvenli Şifreleme ile ilgili bu makalede şifre güvenliğinin yazılıma yeni atılmış arkadaşların zayıf şifreleme , güvenlik ve yanlış anlaşılma konusunun nasıl üstesinden gelinceğini anlatacağım.
Üniversitede ve başka yazılım uygulamalarında çoğu kişiler şifreleri Veritabanında TEXT tabanlı şekilde tutuyorlar, bu gerçekten çok yanlış bir olay ve bunun düzeltilmesi , veritabanına kayıt edilmeden önce form`dan gelen şifrenin enrypt edilmesi ve veritabanına bu şekilde kayıt edilmesi gerçekten önemli bir konudur ve herhangi bir durumda veritabanının kötü ellere geçmesi durumunda tehlikenin boyutunu büyük ölçüde indirgicektir.
Şifre Encypt edilmesi yakın zamana dayanmamaktadır, kullandığımız masa üstü uygulamalardan , mail hesaplarına tutun , en ufak yazılımlarda bile mevcuttur, aslında bilgisayar ve internet hayatımızdaki kimliğimizin bir tür güvencesidir diyebiliriz.
Bu makalede neden gerçek şifrenin veritabanında saklanması yerine encypt edilmiş şekilde saklanması gerektiğini ve bunun PHP ve Mysql örneklendirmesini yapacağım.
Makalemde size “Secure Hashing Algorithm - 1” SHA-1 örneklendirmesini yapacağım. SHA-1 eskisinden artık daha zayıf duruma gelmiştir, bunun için örnek:dijital imzalamalarda SHA-256 ve SHA-512 gibi daha güçlü algoritmalar kullanılması tercih edilmektedir. Şifre encrypt edilmede SHA-1 bügünlerde ne kadar 512 yada 256 kadar güçlü bir algoritma vermesede WEB uygulamarda belirli bir standartın üzerinde güvenlik sağlamaktadır. Bilindiği gibi MD5 günümüzde özellikle WEB uygulamalarında sık kullanılan encryption modelidir ve bize her string için benzersiz 32bit şifreleme vermektedir, SHA-1 md5 den daha gelişmiş olup bize 40bit şifreleme vermektedir. Teknik olarak SHA-1, md5 methodundan daha fazla uzunlukta bir encyption vermektedir, ki bu ne kadar azda olsa daha güvenlik sağlamaktadır . MD5 `in kullanımını tavsiye etmediğim bir nokta ise günümüzde çok sayıda MD5 kırıcı programın mevcut olması, her ne kadar %100 lük bir sonuç vermesede md5 ile tutulan şifreleri %60-80 oranında çözmeye yarayabilirler.
ENCRYPTION Nedir?
Encryption yani ” HASH “ Herhangi bir Data`nın en ufak bir kısmının dijital olarak aktarılmış parmak izi`dir. Ve bunlar TEK YOLLU olmaktadır, yani hash edilmiş bir text mevcut ise bunun geriye dönmesi yanlız başına imkansızdır ( Genellikle ).
Kullanıcılar Nasıl Oturum Açıcaklar? :
Mademki Hash tek taraflı bir dijital şifreleme sistemi, Veritabanına şifre işlendikten sonra kullanıcının gerçekten kendi şifresini girip girmediğini nasıl anlayacağız? Bu gerçekten çok basittir;
Yapılan methoda göre , giriş ekranından gelen şifre hangi sistemle hash edildiyse aynı şekilde hash edilir ve veritabanındaki hash uygulanmış şifre ile karşılaştırılır, eğer tutuyorsa kullanıcı kendi şifresini girmiştir.
Örnek: kullanici_tbl
İd | username | email | parola |
7 | onder | onder@mail.com |67f31c69b59b15009aad6378ab9e9c24f08e6271 |
Örnekte görülen bir tablo yapısıdır ve bir kayıt listelenmiştir, adsd tablosundaki onder adındaki kullanıcı kendi şifresini girerek oturum açmak istemektedir. Bunun için kodlama kısmında yapılması gereken;
Form dan gelen değeri yakalamak=
$parola=@$_POST[‘parola];// Burda formdan gelen parola adındaki form elemanını alıp “$parola” adındaki değişkene atamış olduk. Atama işlemindeki @ işaretini koymamızın sebebi, işleme girmediyse görmezden gel // şeklinde anlatılabilir, Yani bir koşul içinde ise ve o koşul sağlanmıyorsa @ işareti ile yapılmış bir atama yorumlayıcı tarafından görmezden gelinecektir fakat bu güvenliğimizi sağlamayacak sadece yorumlayıcının NOTICE uyarısı vermesini engelleyecektir. Bunun için en iyisi, POST yada GET methodu ile bilgi çekerken onu bir değişkene atama şeklinde değil , bir döngü yada koşullayıcı içinde kullanmanız olucaktır... Örnek verecek olursak:
if($_POST['parola']==row['parola']){
şeklinde gibi....
Değişkene atadıktan sonra veritabanında kayıtlı olan yapıya çevirmemiz gerekiyor karşılaştırma yapabilmemiz için;
Veritabanına SHA1 methodu ile saklamıştık , o zaman yapacagımız şey;
$hash_parola=$parola; // $parola değişkeni bilindiği gibi formdan gelen değere atanmıştı, bizde bunu $hash_parola diye bi değişkene SHA1 methodu ile hash edip yolluyoruz.
Karşılaştırmak için ise bir sql cümleciği yazmamız gerekmektedir;
$sorgu=”Select `parola` FROM `kullanici_tbl` WHERE parola=’$hash_parola’ ”;//
Burda yaptığımız, $sorgu değişkenine Sql cümleciği göndermemiz oldu, sorgumuzda kullanici_tbl adındaki tablodan parola stununda girişi bulunan tüm değerleri $hash_parola değişkeninin içeriği ile karşılaştır.
Bunu Yazılım olarak anlatırsak eğer;
$exec=mysql_query($sorgu);
exec=mysql_fetch_array($row));
$db_password=$row[‘password’];//
İf($db_password==$hash_parola ){
Session_start();
}else{
Die(“Şifrenizi yanlış girdiniz”);
Şeklinde yapılabilir..
Mysql ile Hash etme yöntemi:
Mysql in kendi desteklediği fonksiyon ile Php `de hash yönetemi ile saklayıp Mysql e ekleyebilirsiniz ancak bu pek tavsiye edilmez, Çünki Çok sık değişen Mysql sürümlerinden dolayı Algoritmanın yapısının değişme olasılığı mevcuttur, buda size ilerde sorunlar yaratabilmektedir,
mysql> select PASSWORD( 'PHP & Güvenliği' );
+------------------------------------------+
| PASSWORD( 'PHP & Güvenliği' ) |
+------------------------------------------+
| 379693e271cd3bd6 |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> select MD5( 'PHP & Güvenliği ' );
+-------------------------------------+
| MD5( 'PHP & Güvenliği ' ) |
+-------------------------------------+
| 88dd8f282721af2c704e238e7f338c41 |
+-------------------------------------+
1 row in set (0.01 sec)
Mysql in Hash etme yeteneği MD5 hash yöntemindende daha zayıftır, bu yüzdende Mysql hash fonksiyonunun kullanılmaması tercih edilir.
Özetlemek gerekirse ; Veritabanında tutulan hash edilmiş stringler, atakçıkların ve kırmak isteyenlerin işini büyük ölçüde zorlaştırır, buna rağmen modern bilgisayarlar md5 ve sha1 gibi standart hale gelmiş şifreleme methodlarını üretmek için çok az zamana ihtiyaç duyarlar, modern bir bilgisayar bir string`ten saniyede onbinlerce md5 yada sha1 üretebilir.
Şifreleri kırmak isteyenlerin ilk methodu ellerindeki daha önceden varolan hazır şifre deposunu kullanmak olucaktır. Bu daha önce kırdıkları yada başka yerden aldıkları, onbinlerce yada yüzbinlerce standart kullanıcı şifreleri demektir. Bunları md5 yada sha1 ile encypt edip , kurbanın veritabanındaki hash edilmiş şifrelerle karşılaştırıcaktır, ve tutan bir şifre olursa , bunca emek boşa gitmiş sayılıcaktır.
Bunu önlemenin yegane yolu, kullanıcı kayıt sırasında , kullanıcıya şifre vermektense , ufak bir randomize script yazıp , bu işlemi bilgisayara bırakmak olabilir. Yazıcağınız 12 karakterli bir randomize script ile , sözlük atağının önüne geçmiş olucaksınız.
Bu kodda görüldüğü üzere 12 karakterli bi stringi kod kendisi üretiyor ve otomatik olarak sha1 methodu ile hash ediyor. Bunu yaptıktan sonra kullanıcıya şifresini mail olarak ulaştırabilir ve sisteminize ekstra bir güvenlik katmış olabilirsiniz.
1 yorum:
Slm Önder abi , Makaleni okudum. Çok iyi oldu benim için.Özellikle @ işaretini görüp ne anlama geldiğini bir türlü anlamamıştım.Artık biliyorum :) Ayrıca Delphide program yazarken daha önce md5 ve orjinal adını tam hatırlamadığım bir şifreleme yöntemi kullanmıştım.Bunların phpde de olabileceğini bilmiyodum.Bunuda öğrenmiş oldum. Senden ricam , bu tarz makalelere devam edersen iyi olur. İnternette bir çok yerde döküman var ama ülkemizdeki webmasterlık artık emek paylaşmasına girmiş vaziyette. Okuduğum bir makaleyi başka sitelerde kelimesi kelimesine bulabiliyorum.Buda tek kaynaktan öğrenmek anlamına geliyo. Özgün makalelere ihtiyacımız var.O yüzden zaten kendime ait scriptinide kendim yazdığım bi blog yaptım.Vakit ve konu buldukça yazmaya çalışıyorum.Bide abi şu session ve cookie olaylarını yazabilirsen çok iyi olur bir türlü kafamda oturtamıyorum :) Neyse çok uzun oldu... Kolay gelsin...
Yorum Gönder