Oracle ile Veri Şifreleme

Herkese Selam,

Bu yazıda Oracle’ın veri şifreleme desteğinden bahsedeceğim umarım farkındalık anlamında faydalı bir yazı olur.

Oracle, yazılım geliştiricelere veri şifreleme konusunda 2 farklı paket sunuyor. Bunlar;

  • DBMS_CRYPTO (Oracle 10g ile geldi.)
  • DBMS_OBFUSCATION_TOOLKIT (Oracle 8i ile geldi.)

DBMS_CRYPTO daha güncel olması nedeni ile DBMS_OBFUSCATION_TOOLKIT’den daha fazla ve daha geniş özelliklere sahip. Aşağıda temel olarak bu 2 paket arasındaki farkları görebilirsiniz. 

DBMS_CRYPTO literatürdeki bir çok şifreleme ve hashleme algoritmalarını başarı ile desteklemekte. İhtiyacınız olan algoritmaları kolay bir şekilde seçerek istediğiniz veriyi şifreleyebilir/hashleyebilir veya şifrelenmiş bilgileri açabilirsiniz.

DBMS_CRYPTO Paketinin temel fonksiyonlarına aşağıdan göz atabilirsiniz.

Şimdi anlaşılması ve kullanılması kolay olan bu paket ile karmaşık bir ihtiyacı gideren bir örnek yapalım.

Senaryo: Kendisine parametre olarak gelen değeri DES (Cipher olarak CBC, Padding Olarak PCKS5 ayarları seçilmeli) algoritmasını kullanarak şifreleyip base64 formatında bir çıktı üreten şifreleme metodu yapalım? (Aynı yöntem ile şifrelenmiş veriyi açma işlemini yapacak bir metot daha yazalım.)

Cipher Mode : CBC

Padding: PCKS5

Şifreleme için kullanılacak key: 52AB32;^$!ER94988OPS3W21

Şifreleme için kullanılacak initialization vector (IV): TY54ABCX

Not: Initialization Vector şifreleme ve şifrelenmiş veriyi açmada zorunlu olan parametrelerden değil ancak biz örneği karmaşıklaştırmak için bu parametreyi de kullanıyoruz.

DBMS_CRYPTO paketinin ENCRYPT fonksiyonunun imzası;

DBMS_CRYPTO.ENCRYPT(
                            dst IN OUT NOCOPY BLOB,
                            src IN CLOB CHARACTER SET ANY_CS,
                            typ IN PLS_INTEGER,
                            KEY IN RAW,
                            iv  IN RAW DEFAULT NULL);

Kodu yazmadan önce şifrelemede kullanacağım KEY ve IV bilgisini hexadecimal’e çevirip bir tabloda saklamak istiyorum. Daha sonra Encryption ve Decryption adımlarında bu bilgileri yarattığım tablodan okuyacağım.

CREATE TABLE ALGPARAMETERS
(
  NAME   VARCHAR2(100 BYTE),
  VALUE  NVARCHAR2(100)
);

INSERT INTO ALGPARAMETERS
   SELECT 'key' NAME,
          RAWTOHEX ('52AB32;^$!ER94988OPS3W21') VALUE
     FROM DUAL
   UNION
   SELECT 'iv' NAME, RAWTOHEX ('TY54ABCX') VALUE FROM DUAL;

COMMIT;

SELECT * FROM ALGPARAMETERS;


Şimdi şifrelemeyi yapacak fonksiyonumuzu yazalım.

CREATE OR REPLACE FUNCTION F_ENCRYPT (p_input VARCHAR2)
   RETURN VARCHAR2
AS
   v_encrypted_raw     RAW (2000);
   v_key               RAW (320);
   v_encryption_type   PLS_INTEGER
      :=   DBMS_CRYPTO.DES_CBC_PKCS5;
   v_iv                RAW (320);
BEGIN
   SELECT VALUE
     INTO v_key
     FROM algparameters
    WHERE name = 'key';

   SELECT VALUE
     INTO v_iv
     FROM algparameters
    WHERE name = 'iv';

   v_encrypted_raw :=
      DBMS_CRYPTO.encrypt (src   => UTL_I18N.STRING_TO_RAW (p_input, 'AL32UTF8'),
                           typ   => v_encryption_type,
                           key   => v_key,
                           iv    => v_iv);
   RETURN UTL_RAW.CAST_TO_VARCHAR2 (UTL_ENCODE.base64_encode (v_encrypted_raw));
END;

Şimdi şifrelenmiş veriyi açan fonksiyonumuzu yazalım.

DBMS_CRYPTO paketinin DECRYPT fonksiyonunun imzası;

DBMS_CRYPTO.DECRYPT(
                             dst IN OUT NOCOPY BLOB,
                             src IN            BLOB,
                             typ IN            PLS_INTEGER,
                             key IN            RAW,
                             iv  IN            RAW          DEFAULT NULL);  

 

CREATE OR REPLACE FUNCTION F_DECRYPT (p_input VARCHAR2)
   RETURN VARCHAR2
AS
   v_decrypted_raw     RAW (2000);
   v_key               RAW (320);
   v_encryption_type   PLS_INTEGER := DBMS_CRYPTO.DES_CBC_PKCS5;
   v_iv                RAW (320);
BEGIN
   SELECT VALUE
     INTO v_key
     FROM algparameters
    WHERE name = 'key';

   SELECT VALUE
     INTO v_iv
     FROM algparameters
    WHERE name = 'iv';


   v_decrypted_raw :=
      DBMS_CRYPTO.DECRYPT (
         src   => UTL_ENCODE.base64_decode (UTL_RAW.CAST_TO_RAW (p_input)),
         typ   => v_encryption_type,
         key   => v_key,
         iv    => v_iv);


   RETURN UTL_I18N.RAW_TO_CHAR (v_decrypted_raw, 'AL32UTF8');
END;

Şifreleme işlemini gerçekleştiren ve şifrelenmiş bilgiyi açan fonksiyonlarımızı yazdık. Sıra geldi bu fonksiyonları test etmeye.

SELECT 'TEST123TEST' INPUT, 
        F_ENCRYPT('TEST123TEST') ENCRYPTED_RESULT,
        F_DECRYPT(F_ENCRYPT('TEST123TEST')) DECRYPT_RESULT 
FROM DUAL;

Sonuçtan da görüldüğü gibi, ihtiyaçlarımız doğrultusunda şifreleme ve şifre açma işlemlerini başarılı ve hızlı bir şekilde yapabildik.

DBMS_CRYPTO paketi ile ilgili daha detaylı bilgiye erişmek için aşağıdaki linki takip edip ihtiyaçlarınıza uygun çözümü hızlıca uygulayabilirsiniz.

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_crypto.htm#i1003081

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Uncategorized and tagged , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s