Php’de veri şifreleme mantığı

Kategori: (Web Programlama) Yazan: admin, 13-12-2009

Etiketler : , , , , , , , ,

Verilerimizi veritabanımızda saklarken bazılarını şifreleme gereksinimi duyarız. Bunlardan en önemlisi herkesinde bildiği gibi kullanıcı şifreleridir. Şifrelememizin önemi, herhangi bir şekilde 3. kişisinin eline geçen verilerin kötü amaçlı kullanılmasının önüne geçilmesidir. Profesyonel sistem yazan her coder mutlaka şifreleme yapar.

Şifreleme mantığını ben iki kategoriye ayırıp anlatmaya çalışacağım.

  • Geri dönüşümsüz şifreleme
  • Geri dönüşümlü şifreleme

İsimlerden anlaşılacağı üzere şifreleme tiplerimizi ikiye ayırdık. Şimdi bunlara sırayla bakmaya ve örnek bir kaç fonksiyon yazalım.

Geri dönüşümsüz şifreleme;

Bu şifreleme mantığında şifrelediğimiz verileri biz dahil kimse geri dönüştüremez. Büyük sistemlerin çoğu bunu kullanmaktadır. Kendileri dahil kimse şifrelenmiş verinin ne olduğunu çözemez. Bu şifreleme türünde genelde kullanılan iki php fonksiyonu bulunmaktadır. ( md5(); ve sha1(); ). Bu fonksiyonlar Php’nin tek yönlü kendi şifreleme yöntemidir. Verimizi bu fonksiyonları kullanarak hızlı bir şekilde şifrelemiş oluruz. Tek md5() ya da tek sha1() kullandığımız zaman verinin çözülme olasılığı olduğundan bu fonksiyonların kombinasyonunu kullandığımızda verinin çözümü için ömür gerekmektedir. Örnek vermek gerekirse;

<?
function sifrele($sifre){
return md5(md5(sha1(sha1($sifre))));
}
?>

Yazacağımız basit bir fonksiyonla  şifrenin çözümü oldukça zor hatta imkansızdır. Tabikide geri dönüşümsüz şifrelemenin tek yolu bu değildir. Şifreleme için kullanıcı tarafından girilen verileri kendi belirlediğimiz bazı karakterlere dönüştürerek yine geri dönüşümsüz bir şifreleme yaparız. Buna örnek vermek gerekirse;

<?
function sifrele($sifre){
$sifre = str_replace(“a”, “111″, $sifre);
$sifre = str_replace(“b”, “222″, $sifre);
$sifre = str_replace(“c”, “333″, $sifre);
$sifre = md5(sha1($sifre));
}
?>

Basitçe karakterleri belirlediğimiz karakterlere dönüştürüp, üstüne md5 ile sha1 kullandığımız zaman kırılması imkansız bir şifreleme oluştururuz fakat bu kadar kasmaya cidden gerek yok. Üstteki yazdığımız fazlasıyla yeterli.

Geri dönüşümlü şifreleme;

Kullanıcı şifrelerini şifreleme yaptığımızda genelde kullandığımız yer login alanlarıdır. Kullanıcı login olurken veritabanımızda daha önce şifrelediğimiz veri ile kullanıcının giriş yaparken yazdığı şifreyi fonksiyonumuzdan geçirerek doğru mu değil mi diye bakarız. Başka alanlar da genelde kullanmaya gerek yoktur. Fakat öyle şifreler vardır ki hem başkalarının eline geçtiğinde tehlike yaratır, hem de yazdığımız sistemde başka alanlarda çözüp kullanmamız gerekmektedir. Whmcs’de gördüğüm ve bir arkadaşım için kodladığım sunucu kontrol panelinde kullandığım için bu mantığıda anlatıyorum. Geri dönüşümlü şifreleme yaparken md5 ya da sha1 gibi tek yönlü şifreleme fonksiyonlarını kullanamayız. Bunun için Php’nin bize sunduğu iki yönlü şifreleme hem encode hem de decode yapan fonksiyonlar bulunmaktadır. ( base64_encode(); ve base64_decode(); ).

<?php

echo base64_encode(“mahir”); // çıktı : bWFoaXI=

echo base64_decode(“bWFoaXI=”); // çıktı : mahir

?>

Yukarıda yazdığım kodu çalıştırdığınızda decode ve encode halini göreceksiniz. Yalnız bu kesinlikle yeterli değildir. md5 yada sha1 gibi bi kaç sefer yapmanız bile bence yeterli değildir. Çünkü bu fonksiyonları bilen bir coder bile bir bakışta base64 fonksiyonunun kullanıldığını anlayacaktır ve çözmek için fazla zaman harcamayacaktır. Bu yüzden olaya biraz daha karmaşık hal katıp kendi kullandığım old() ve chr() fonksiyonlarını işin içine katmalıyız. Tabi ki bu fonksiyonlar benim kullandığım coderin tecrübesine göre daha farklı kodlar yazılabilir. old() girilen karakterin sayısal değerini, chr() ise girilen sayının karakter değerini veren fonksiyonlardır. Bir örnekle açıklamak gerekirse;

<?
function mahirsifrele($param){
$karakter = strlen($param);
for($i = 0; $i < $karakter; $i++){
$veri .= ord(substr($param, $i, $i+1)) .”-”;
}
return $veri;
}

function mahirsifrecoz($param){
$param = explode(“-”, $param);
$karakter = count($param) – 1;
for($i = 0; $i < $karakter; $i++){
$veri .= chr($param[$i]);
}
return $veri;
}
?>

Şifreleme fonksiyonumuzda karakterleri parçalayıp sayısal değerini alıp aralarına tire(-) koyarak (sonradan çözerken kolaylık olsun diye) şifreliyoruz, çözerkende tam tersi işlem yapıyoruz. base64de kullanarak biraz daha karmaşık ve zorlaştırabiliriz.

Unutmayın ki geri dönüşümlü şifreleme yapıldığında kırılmaz diye bir olasılık kesinlikle yoktur. Zor kırılır şifre vardır. Zor kırılan şifreleme yapmakta tamamen sizin akıl oyununuza bakıyor. Ben işin tamamen mantığını anlatmaya çalıştım. İnşallah başarılı olabilmişimdir. Teşekkür ederim.

Yorumlar:

Php’de veri şifreleme mantığı yazısına 6 Yorum ”


  1. Güzel konu ve çok güzel anlatım.
    Gerçekten güzel şeyler öğrendim.


  2. Gerçekten php Nin nimetlerini Güzel sömürmüşsünüz


  3. Mahir kardeş ellrine,emeğine sağlık. Sayende php ye olan merakım fazlasıyla arttı, sayende çok güzel şeyler öğrendim teşekkürler.


  4. klavyene sağlık güzel bir makale yalnız benim sormak istediğim bir konu var.Ben verileri veritabanımda depolamak istiyorum.Ancak veriyi ne kadar küçültürsem ne kadar az yer kaplarsa o kadar kullanışlı olacak.Bunu nasıl yapabilirim bildiğim kadarıyla base64 veriyi %33 büyütmekte…


  5. Arkadaşım ellerine klavyene sağlık, harika bir yazı olmuş.


  6. Çok güzel bir konuya değinmişsiniz teşekür ederim

Yorum Yazın

19 - 9 = ? (İşleminin Sonucu)