Cumartesi, 9 Mayıs 2009

Şifreleme Kütüphanesi

 

Şifreleme Kütüphanesi, CodeIgniter`da kullandığımız bazı değişkenlere ait değerleri şifrelemek ve bunları tekrar gerçek değerine getirmek üzere 64 bit şifreleme sistemini verdiğimiz bir anahtar kelimeyi de kullanarak sağlayan bir kütüphanedir.

Kütüphaneyi yazmaktaki amaçlarım:

  • formlara gönderdiğimiz gizli değişkenlerin kullanıcılar tarafından kaynak kodların görüntülenmesi ile öğrenilmemesi,
  • proje dizinleri altına kaydettiğimiz dosyaların (fotoğraf, video, zip vs.) isimlerinin elde edilmemesi,
  • url satırından aktarılacak değişkenlerde hata veren işaretlerin (bölü, ters bölü, soru işareti vs) taşınması

Kütüphane kodunu inceleyelim. Kütüphanemizin adı Crypt. PHP 5 ve üzeri versiyonlar için kullanılır. Dosyamızın yeri application/libraries dizini altındadır. Dosya ismi crypt.php dir.

if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Crypt
 * Encryption and Decryption library
 * 
 *
 * Features:
 * + To encrypt and decrypt words with encryption keys
 * 
 * Requirements:
 * PHP 5.0+
 *
 * Usage:
 *
 * In your controller:
 * $this->load->library('crypt'); 
 * 
 * Syntax
 * $this->crypt->set_key(); : to set encryption key
 * $this->crypt->encrypt($plain_word) : to encrypt data
 * $this->crypt->decrypt($encrypted_word) : to decrypt data
 *
 * @package CodeIgniter
 * @subpackage Libraries
 * @category Encryption and decryption
 * @author  Fatih Bazman : fatihbazman at gmail.com
 * @version  1.0
 * @license  http://creativecommons.org/licenses/by-sa/3.0/us/
 */

class Crypt 
{

 private $cKey;
 private $CI;

 
 function __construct()
 {

  $this->CI =& get_instance();

        log_message('debug', 'Crypt library was initialized.');
        
    }
 
 function set_key($encryption_key=NULL) 
 {

  if(isset($encryption_key)) $this->cKey = $encryption_key;
  else $this->cKey = $this->CI->config->item('encryption_key');
        
    }
 
    function encrypt($cData)
    {
          $cResult = '';

          for($i = 0; $i < strlen($cData); $i ++)
          {
             $cChar    = substr($cData, $i, 1);
             $cKeyChar = substr($this->cKey, ($i % strlen($this->cKey)) - 1, 1);
             $cChar    = chr(ord($cChar) + ord($cKeyChar));
             $cResult .= $cChar;
          }

          return $this->encode_base64($cResult);
    }

    function decrypt($cData)
    {
          $cResult = '';
          $cData   = $this->decode_base64($cData);

          for($i = 0; $i < strlen($cData); $i ++)
          {
             $cChar    = substr($cData, $i, 1);
             $cKeyChar = substr($this->cKey, ($i % strlen($this->cKey)) - 1, 1);
             $cChar    = chr(ord($cChar) - ord($cKeyChar));
             $cResult .= $cChar;
          }

        return $cResult;
    }

    private function encode_base64($cData)
    {
        $cBase64 = base64_encode($cData);

       return strtr($cBase64, '+/', '-_');
    }

    private function decode_base64($cData)
    {
        $cBase64 = strtr($cData, '-_', '+/');

        return base64_decode($cBase64);
    }
 
}

set_key fonksiyonu: şifreleme sırasında kullanacağımız kelimemizi tanımladığımız fonksiyondur. Eğer set_key fonksiyonu ile encryption_key değeri tanımlanmazsa application/config/config.php dosyasında $config['encryption_key'] değişkeninde tanımlı değeri kullanır. Bu fonksiyon ile istenirse farklı anahtarlar kullanılarak, her durum için farklı şifreleme metodu kullanılabilir.

encrypt fonksiyonu: şifrelenmesini istediğimiz kelimeyi (değeri) girdiğimiz fonksiyondur. Geri dönüşünde oluşturduğu şifrelenmiş kelimeyi verir.

decrypt fonksiyonu: şifrelenmiş kelimeyi (değeri) girdiğimiz fonksiyondur. Geri dönüşünde şifrelenmemiş kelimeyi verir.

Kullanımı için örnek bir controller dosyası inceleyelim. Bu dosyamızın yeri application/controllers dizini altındadır. Dosya adı Form.php dir.


class Form extends Controller {

 function Form()
 {
  parent::Controller(); 
  $this->load->library('crypt');  
 }
 
 function index()
 {

  $this->crypt->set_key("hello world how are you");

  $data['word'] = "great_walley_picture.jpg";
  $data['encrypted'] = $this->crypt->encrypt($data['word']);
  $data['decrypted'] = $this->crypt->decrypt($data['encrypted']);
 
  $this->load->view('form_view',$data);

 }

}

Form controller dosyasında Form metodunda kütüphanemizi yüklüyoruz. Index metodunda ise önce şifreleme kelimemizi "hello world how are you" olarak tanımlıyoruz. Bu tamamen size bağlı bir kelime, cümle olabilir. Şifrelenmesini istediğimiz dosya ismimizi "great_walley_picture.jpg" tanımlıyor, kütüphanemize şifrelemek için $this->crypt->encrypt fonksiyonunu kullanıyoruz. Şifreyi çözmek için ise $this->crypt->decrypt fonksiyonunu çalıştırıyoruz.

Şimdi de örnek view dosyamıza bakalım. Bu dosyamızın yeri application/views dizini altındadır. Dosya adı Form_view.php dir. Bu dosyamızda da controller dosyamızda aldığımız değişkenleri ekrana bastırıyoruz.


Cryption results

<p>word : <?=$word?$gt;</p> <p>encrypt : <?=$encrypted?></p> <p>decrypt : <?=$decrypted?></p>

Bu yazıda anlatılan dosyalara bu adresteki application dizini aracılığıyla ulaşabilir, CodeIgniter yükledikten sonra gerekli ayarların yapılmasının ardından kullanabilirsiniz.

Yorumlar

Ellerine sağlık Fatih yine çok güzel bir konuya değinmişsin...

tesekkurler fatih bu aralar zamanin cok galiba eskisinden daha hizli makale guncelliyosun :) yararli bir makale cok tesekkurler...

Rica ederim. Kullanıcıların işine yarıyorsa ne mutlu bana.

Yalnız bu makale ile ilgili bir iki nokta var belirtmek istediğim: şifreleme kütüphanesi CodeIgniter paketi içinde Encrypt adı ile standart geliyor.

Benim yazdığım Crypt ise şifreleme kütüphanesinin hangi amaçlar ile ve nasıl yazılacağı konusunda kullanıcılara bilgi vermek amacı ile yazılmıştır.

Bu makalede anlatılanları okuduktan sonra CodeIgniter Encrypt sınıfını incelemenizde fayda var.

Yorum Ekle