-- Güvenlik, Oracle, PL/SQL, Veri Güvenliği

Oracle ile Veri Şifreleme(Data Encryption)

Makale öncesi : Veri güvenliği ve şifreleme ile ilgili düşüncelerimi anlattığım SQL Server ile Veri Şifreleme(Data Encryption) makalemi inceleyebilirsiniz.

Bu makalemde tablo ve Oracle mimarisine fazla girmeden bir paket oluşturarak veri şifrelemeyi nasıl yapacağımıza bir bakacağız.

Java ve Oracle’cıların bildiği gibi paketler kendi içerisinde farklı yazılım nesnelerini tutmak ve bunları Paket.NesneAd şeklinde kolay, yönetilebilir olarak kullanabilmek için tasarlanmıştır.

Şimdi şifreleme işlemiyle ilgili paketimizin başlık kısmını, daha sonra da gövdesini oluşturalım.

CREATE OR REPLACE PACKAGE Araclar AS
  FUNCTION Sifrele (p_text  IN  VARCHAR2) RETURN RAW;
  FUNCTION SifreCoz (p_raw  IN  RAW) RETURN VARCHAR2;
END Araclar;

Görüldüğü üzere paket içerisinde iki fonksiyon var ve bunlardan biri şifreleme işlemi yaparken diğeri de bu şifreyi çözmek için tasarlandı. Şimdi bu paketin gövdesini oluşturalım.

CREATE OR REPLACE PACKAGE BODY Araclar AS
  g_key     RAW(32767)  := UTL_RAW.cast_to_raw('keyimbenim');
  g_pad_chr VARCHAR2(1) := '~';
  PROCEDURE padstring (p_text  IN OUT  VARCHAR2);
  FUNCTION Sifrele (p_text  IN  VARCHAR2) RETURN RAW IS
    l_text       VARCHAR2(32767) := p_text;
    l_encrypted  RAW(32767);
  BEGIN
    padstring(l_text);
    DBMS_OBFUSCATION_TOOLKIT.desencrypt(input          => UTL_RAW.cast_to_raw(l_text),
                                        key            => g_key,
                                        encrypted_data => l_encrypted);
    RETURN l_encrypted;
  END;
  FUNCTION SifreCoz (p_raw  IN  RAW) RETURN VARCHAR2 IS
    l_decrypted  VARCHAR2(32767);
  BEGIN
    DBMS_OBFUSCATION_TOOLKIT.desdecrypt(input => p_raw,
                                        key   => g_key,
                                        decrypted_data => l_decrypted);                                  
    RETURN RTrim(UTL_RAW.cast_to_varchar2(l_decrypted), g_pad_chr);
  END;
  PROCEDURE padstring (p_text  IN OUT  VARCHAR2) IS
    l_units  NUMBER;
  BEGIN
    IF LENGTH(p_text) MOD 8 > 0 THEN
      l_units := TRUNC(LENGTH(p_text)/8) + 1;
      p_text  := RPAD(p_text, l_units * 8, g_pad_chr);
    END IF;
  END;
END Araclar;

Paket oluşturma işlemini gerçekleştirdik. Artık Sifrele ve SifreCoz fonksiyonlarını kullanarak şifreleme işlemi gerçekleştirebiliriz.

SET SERVEROUTPUT ON;
DECLARE
p_deger VARCHAR2(16) := 'cihanozhan.com';
p_raw RAW(16);
BEGIN
DBMS_OUTPUT.put_line('Girilen Veri : ' || p_deger);
p_raw := Araclar.Sifrele(p_deger);
DBMS_OUTPUT.put_line('Şifreli Veri : ' || p_raw);
DBMS_OUTPUT.put_line('Şifresi Çözülen Veri : ' || Araclar.SifreCoz(p_raw));
END;

Şifreleme ve şifreden geri döndürme işlemi sonrasında ekran çıktısı aşağıdaki gibi olacaktır.

Ekran Alıntısı

İyi çalışmalar.
Cihan Özhan

Yorumla

Yorum