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ız. DES 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:
Sifrelemeden Cikan Kelime: OGANOZDOGANOGANO Verilen kelime cozumlenen kelimeye esit, DES anahtarlama calisti
vø¡
---------------------------------------------------------------------------------------
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:
Yorum Gönder