5 Ocak 2011 Çarşamba

DBMS_OBFUSCATION_TOOLKIT Kullanımı ve Ayrıntılı Anahtarlama

Selam,


Biraz da PL/SQL sorguları ve blokları ile ilgilenelim dedim ve Oracle'ın gömülü paketlerinden olan DBMS_OBFUSCATION_TOOLKIT'i inceleyeceğiz. Herşeyden önce bu kelimelerin Türkçe anlamlarını ifade edelim. "To obfuscate" karartmak ve "Toolkit" araç demek. Aklınıza bu paketle ilgili olarak ilk gelen şey konusunda haklısınız.


DBMS_OBFUSCATION_TOOLKIT bize verinin encrypt edilmesini yani şifrelenmesini sağlamaktadır. Bunu yaparken de DES (Data Encyrption Standard) kullanılmaktadır. Bir soru olarak şunu sorabilirsiniz "Veritabanımdaki veriler kıymetli ve kötü niyetli bir DBA'in bu verileri görüntülemesini istemiyorum ve verimi korumak istiyorum." Bu sorunun cevabı olarak DBMS_OBFUSCATION_TOOLKIT kullanalım demek yerine aslında DBA hesabını koruyalım cevabı daha mantıklıdır. 


Bu özet anlatımdan sonra DBMS_OBFUSCATION_TOOLKIT'in neler yapabildiğine bakalım;


DES olarak bilinen ve 20 yıldan fazladır bir ANSI standardı olarak kullanılmakta olan şifreleme metodu kullanılmaktadır. Banklar da özel işlemleri için bu tipte bir algoritmayı kullanarak şifreleme işlemi gerçekleştirmektedirler. DES ileride yerini AES (Advanced Encyrption Standard)'a bırakacaktır. DES mantığına göre şifrelenecek olan her bilginin bir anahtarı vardır ve bu anahtar hem şifrelemekte hem de şifreyi çözmekte kullanılmaktadır. DES şifrelemesini yaparken 64-bit bloklar kullanarak 56-bit anahtarlama gerçekleştirmektedir. 


Oracle DBMS_OBFUSCATION_TOOLKIT paketini SYS kullanıcısı altında oluşturmaktadır. Bu paket yaratıldıktan sonra isterseniz, dilediğiniz kullanıcı veya role paketin çalıştırılması hakkını atayabilirsiniz. PUBLIC'e de aynı hak tanınabilir.


Anahtarlama yönetimine baktığımızda ise en önemli faktör, veriler için düzgün anahtarlamanın yapılıyor olmasıdır. Eğer anahtarlama kötü şekilde seçilirse, kırması da kolay olacaktır. Bu durumda olası bir saldırıda karşıda bulunan kişinin uygulayacağı metod rastgele anahtarlar seçerek, doğru olanı beklemek yerine bir kripto analiz ile zayıf anahtarlama kırılabilir. Anahtarlama rastgele olarak sayılardan seçilmekte ve şifreleme de buna göre tamamlanmaktadır. 


DBMS_OBFUSCATION_TOOLKIT paketi bizim için rastgele sayılardan oluşan bir anahtarlama, şifreleme yöntemi sunmaktadır ancak bu anahtarlamanın bakımını yapmamaktadır. Uygulamayı geliştiren kişinin sorumluluğunda olan bu durum, sürekli olarak kontrol edilmeli ve paket kullanılmalıdır. Bunun yanı sıra, DBMS_OBFUSCATION_TOOLKIT ile gerçekleştirilen anahtarlama ve diğer bütün işlemler sunucu tarafında bulunmaktadır, kullanıcı tarafında değil. Anahtarlamanın kullanıcıdan sunucuya geçtiği durumlarda da aradaki bağlantının (network connection) da şifrelenmiş olması gerekmektedir.


Yapılan anahtarlamanın bulunacağı ve saklanacağı yerle ilgili yapabileceğiniz 3 farklı yol bulunmaktadır;


1) Anahtarları veritabanında tutmak.
2) Anahtarları işletim sisteminde bulundurmak.
3) Kullanıcıya yönettirmek.


Anahtarları Veritabanında Saklamak


Bu yöntem her zaman ve %100 koruma sağlamayabilir zira kötü niyetli bir DBA için ulaşması kolay olacaktır. Bunun nedeni her DBA'in şifrelenmiş olan veriye her an ulaşabileceğidir. Tabii bu tipte bir koruma, saklama yöntemi diğer kullanıcılar için oldukça faydalı olabilir. Bir örnek olarak kullanıcıların TC Kimlik Numaraları'nı seçebiliriz. Bu numaraları aynı tabloda anahtarlamak ve saklamak yerine başka bir tabloda anahtarlayıp ve saklayıp, PK - FK (Primary Key, Foreign Key) ilişkisini kullanabilirsiniz. Bunu da yine paketi kullanarak, doğru anahtarlamayı bulup yapabilirsiniz.


Oracle'ın tavsiye ettiği PL/SQL kod şifrelenmesi yöntemi "wrap"tir yani sarmak, paketlemektir. Bu şekilde anahtarlama içeren bir kodu da diğer kullanıcılardan saklamış olursunuz. Sarılı haldeki bir PL/SQL bloğu aşağıdaki şekilde olabilir;



CREATE OR REPLACE PACKAGE BODY LOADER wrapped
0
abcd
abcd
abcd
3
b
9200000
1
4
0
27a
2 :e:
1PACKAGE:
1BODY:
1OPTIMA_LOADER:
1POP_LOADER_PARAMS:
1P_PRID:
....
/


Anahtarları İşletim Sisteminde Saklamak


PL/SQL bloğu içerisinden yapabileceğiniz isteklerle işletim sistemi üzerinde sakladığınız şifrelenmiş anahtarlarınızı talep edebilirsiniz. Burada da dikkat edilmesi gereken konu hem veritabanı kullanıcısının hakları hem de bu kullanıcının, anahtarları sakladığınız (muhtemelen bir dosyada) objeye olan erişim ve kullanım hakları.


Anahtarları Kullanıcıya Yönettirmek


Eğer anahtarları size sağlayacak olan kullanıcının kendisi ise, bir ağ şifrelemesi yapıyor olmanız oldukça önemlidir.


DBMS_OBFUSCATION_TOOLKIT'in sahip olduğu prosedür ve fonksiyonlar aşağıdadır;


DES3ENCRYPT
DES3DECRYPT
DES3GETKEY

DESENCRYPT
DESDECRYPT
DESGETKEY
MD5

İçerisinde "3" olan prosedür veya fonksiyon isimlendirmeleri DES'in farklı bir tür anahtarlamasını kullanmaktadır ve biraz daha komplike bir algoritmadır. Yukarıdaki paketlerin sentaksları aşağıda gösterilmektedir;

DES3ENCRYPT

DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt(
   input           IN     RAW,
   key             IN     RAW,
   encrypted_data  OUT    RAW,
   which           IN     PLS_INTEGER  DEFAULT TwoKeyMode
   iv              IN     RAW          DEFAULT NULL);

DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt(
   input_string      IN     VARCHAR2,
   key_string        IN     VARCHAR2,
   encrypted_string  OUT    VARCHAR2,
   which             IN     PLS_INTEGER  DEFAULT TwoKeyMode
   iv_string         IN     VARCHAR2     DEFAULT NULL);

DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt(
   input        IN RAW,
   key          IN RAW,
   which        IN PLS_INTEGER DEFAULT TwoKeyMode
   iv           IN RAW         DEFAULT NULL)
  RETURN RAW;

DBMS_OBFUSCATION_TOOLKIT.DES3Encrypt(
   input_string  IN VARCHAR2,
   key_string    IN VARCHAR2,
   which         IN PLS_INTEGER DEFAULT TwoKeyMode
   iv_string     IN VARCHAR2    DEFAULT NULL)
  RETURN VARCHAR2;

DES3DECRYPT


DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT( 
    input             IN   RAW,
   key               IN   RAW, 
    decrypted_data    OUT  RAW, 
    which             IN   PLS_INTEGER  DEFAULT TwoKeyMode 
    iv                IN   RAW          DEFAULT NULL); 

 DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT(
    input_string      IN   VARCHAR2, 
    key_string        IN   VARCHAR2, 
    decrypted_string  OUT  VARCHAR2, 
    which             IN   PLS_INTEGER  DEFAULT TwoKeyMode 
    iv_string         IN   VARCHAR2     DEFAUTL NULL);

 DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT( 
    input         IN  RAW,
   key           IN  RAW, 
    which         IN  PLS_INTEGER DEFAULT TwoKeyMode 
    iv            IN  RAW         DEFAULT NULL) 
    RETURN RAW;

DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT( 
    input_string  IN  VARCHAR2, 
    key_string    IN  VARCHAR2, 
    which         IN  PLS_INTEGER DEFAULT TwoKeyMode 
    iv_string     IN  VARCHAR2    DEFAULT NULL) 
   RETURN VARCHAR2;


DES3GETKEY


DBMS_OBFUSCATION_TOOLKIT.DES3GetKey(
   which        IN   PLS_INTEGER DEFAULT TwoKeyMode,
   seed         IN   RAW,
   key          OUT  RAW);

DBMS_OBFUSCATION_TOOLKIT.DES3GetKey(
   which        IN   PLS_INTEGER DEFAULT TwoKeyMode,
   seed_string  IN   VARCHAR2,
   key          OUT  VARCHAR2);

DBMS_OBFUSCATION_TOOLKIT.DES3GetKey(
   which  IN  PLS_INTEGER DEFAULT TwoKeyMode,
   seed   IN  RAW)
 RETURN RAW;

DBMS_OBFUSCATION_TOOLKIT.DES3GetKey(
   which        IN  PLS_INTEGER DEFAULT TwoKeyMode,
   seed_string  IN  VARCHAR2)
 RETURN VARCHAR2;

DESDECRYPT


DBMS_OBFUSCATION_TOOLKIT.DESDecrypt( 
     input             IN   RAW,
   key               IN   RAW, 
     decrypted_data    OUT  RAW); 

DBMS_OBFUSCATION_TOOLKIT.DESDecrypt( 
     input_string      IN   VARCHAR2, 
     key_string        IN   VARCHAR2, 
     decrypted_string  OUT  VARCHAR2); 

DBMS_OBFUSCATION_TOOLKIT.DESDecrypt( 
     input            IN  RAW, 
     key              IN  RAW) 
     RETURN RAW; 

DBMS_OBFUSCATION_TOOLKIT.DESDecrypt( 
     input_string     IN  VARCHAR2, 
     key_string       IN  VARCHAR2) 
     RETURN VARCHAR2;


DESENCRYPT


DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(
   input            IN    RAW,
   key              IN    RAW,
   encrypted_data   OUT   RAW);

DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(
   input_string     IN    VARCHAR2,
   key_string       IN    VARCHAR2,
   encrypted_string OUT VARCHAR2);

DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(
   input         IN  RAW,
   key           IN  RAW)
  RETURN RAW;

DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(
   input_string  IN  VARCHAR2,
   key_string    IN  VARCHAR2)
  RETURN VARCHAR2;


DESGETKEY


DBMS_OBFUSCATION_TOOLKIT.DESGetKey( 
   seed         IN   RAW, 
   key          OUT  RAW); 

DBMS_OBFUSCATION_TOOLKIT.DESGetKey( 
   seed_string  IN   VARCHAR2, 
   key          OUT  VARCHAR2); 

DBMS_OBFUSCATION_TOOLKIT.DESGetKey( 
   seed IN RAW) 
  RETURN RAW; 

DBMS_OBFUSCATION_TOOLKIT.DESGetKey( 
   seed_string IN VARCHAR2) 
  RETURN VARCHAR2;


MD5


DBMS_OBFUSCATION_TOOLKIT.MD5( 
   input            IN   RAW, 
   checksum         OUT  raw_checksum); 

DBMS_OBFUSCATION_TOOLKIT.MD5( 
   input_string     IN   VARCHAR2, 
   checksum_string  OUT  varchar2_checksum); 

DBMS_OBFUSCATION_TOOLKIT.MD5( 
   input         IN  RAW) 
   RETURN raw_checksum; 

DBMS_OBFUSCATION_TOOLKIT.MD5( 
   input_string  IN  VARCHAR2) 
   RETURN varchar2_checksum;


Burada MD5'in ne olduğuna ilişkin detaylı bilgi için tıklayınızDES içinse tıklayınız. Burada "Tiple DES" ile ilgili de bilgi bulabilirsiniz. (içerisinde 3 olan fonksiyon ve paketler için)


Son olaraksa çok ufak bir örnek göstermek istiyorum;


DECLARE
 input_string        VARCHAR2(16) := 'OGANOZDOGANOGANO';
 key_string          VARCHAR2(8)  := 'SifReleM';  
 encrypted_string    VARCHAR2(1000);
 decrypted_string    VARCHAR2(1000); 
BEGIN
   dbms_output.put_line('Verilen Kelime: '|| input_string);
      dbms_obfuscation_toolkit.DESEncrypt( 
                   input_string => input_string, 
                   key_string => key_string, 
                   encrypted_string => encrypted_string );
      dbms_output.put_line('Sifrelenen Kelime: '|| encrypted_string);
      dbms_obfuscation_toolkit.DESDecrypt(
                   input_string => encrypted_string, 
                   key_string => key_string, 
                   decrypted_string => decrypted_string);
      dbms_output.put_line('Sifrelemeden Cikan Kelime: ' || decrypted_string);  
      if input_string = decrypted_string THEN
         dbms_output.put_line('Verilen kelime cozumlenen kelimeye esit, DES anahtarlama calisti');
      END IF;
END;

Çıktı
---------------------------------------------------------------------------------------
Verilen Kelime: OGANOZDOGANOGANO
Sifrelenen Kelime: ù` 0ÚĞ¡ëÑfkdB?Ã?
Sifrelemeden Cikan Kelime: OGANOZDOGANOGANO
Verilen kelime cozumlenen kelimeye esit, DES anahtarlama calisti
---------------------------------------------------------------------------------------


DECLARE
 input_string        VARCHAR2(16) := 'OGANOZDOGANOGANO';
 key_string          VARCHAR2(12)  := 'SifREliYorUM';  
 encrypted_string    VARCHAR2(1000);
 decrypted_string    VARCHAR2(1000); 
BEGIN
   dbms_output.put_line('Verilen Kelime: '|| input_string);
      dbms_obfuscation_toolkit.DESEncrypt( 
                   input_string => input_string, 
                   key_string => key_string, 
                   encrypted_string => encrypted_string );
      dbms_output.put_line('Sifrelenen Kelime: '|| encrypted_string);
      dbms_obfuscation_toolkit.DESDecrypt(
                   input_string => encrypted_string, 
                   key_string => key_string, 
                   decrypted_string => decrypted_string);
      dbms_output.put_line('Sifrelemeden Cikan Kelime: ' || decrypted_string);  
      if input_string = decrypted_string THEN
         dbms_output.put_line('Verilen kelime cozumlenen kelimeye esit, DES anahtarlama calisti');
      END IF;
END;


Çıktı
---------------------------------------------------------------------------------------
Verilen Kelime: OGANOZDOGANOGANO
Sifrelenen Kelime: 
vø¡
Sifrelemeden Cikan Kelime: OGANOZDOGANOGANO Verilen kelime cozumlenen kelimeye esit, DES anahtarlama calisti
---------------------------------------------------------------------------------------

DECLARE
 input_string        VARCHAR2(16) := 'OGANOZDOGANOGANO';
 key_string          VARCHAR2(8)  := 'Sdasasda';  
 encrypted_string    VARCHAR2(1000);
 decrypted_string    VARCHAR2(1000); 
BEGIN
   dbms_output.put_line('Verilen Kelime: '|| input_string);
      dbms_obfuscation_toolkit.DESEncrypt( 
                   input_string => input_string, 
                   key_string => key_string, 
                   encrypted_string => encrypted_string );
      dbms_output.put_line('Sifrelenen Kelime: '|| encrypted_string);
      dbms_obfuscation_toolkit.DESDecrypt(
                   input_string => encrypted_string, 
                   key_string => key_string, 
                   decrypted_string => decrypted_string);
      dbms_output.put_line('Sifrelemeden Cikan Kelime: ' || decrypted_string);  
      if input_string = decrypted_string THEN
         dbms_output.put_line('Verilen kelime cozumlenen kelimeye esit, DES anahtarlama calisti');
      END IF;
END;

Çıktı
---------------------------------------------------------------------------------------
Verilen Kelime: OGANOZDOGANOGANO
Sifrelenen Kelime:  ¹7ÌL¸TŞ-ı Æşgª
Sifrelemeden Cikan Kelime: OGANOZDOGANOGANO
Verilen kelime cozumlenen kelimeye esit, DES anahtarlama calisti
---------------------------------------------------------------------------------------

İyi çalışmalar dilerim.

Ogan

Hiç yorum yok:

Takip et: @oganozdogan