Arşiv

Posts Tagged ‘utl_raw’

pl/sql de md5 kullanımı


Merhabamd5
Size daha önce pl/sql de base64 encode & decode kullanımı anlatmıştım. Bugün base4 şifrelemesinden farklı olarak tek yönlü çalışan md5 veril şifreleme işlemini pl/sql de kullanımını anlatacağım. MD5 (Message-Digest algorithm 5), veri bütünlüğünü test etmek için kullanılan, Ron Rivest tarafından 1991 yılında geliştirilmiş bir kriptografik özet (tek yönlü şifreleme) algoritmasıdır. Girdi verinin boyutundan bağımsız olarak 128 bitlik özetler üretir.
Base64 ile verilerimi çift yönlü olarak şifreleyip,çözebiliyorduk. Md5 işleminde farklı olarak veriler tek yönlü şifrelendiği için geri çözme işlemi bulunmamaktadır, bu sebeple kontrol işlemlerinde kontrol verisinide md5 ile şifreleyip iki şifreleri verinin kontrolünü yapmalıyız. Örnek md5 verilermizi oluşturacak olan fonksiyonumuzu hazırlayalım.

create or replace function CreateMd5(vDeger in varchar2) return varchar2 is
  vMd5InRaw  raw(32767);
  vMd5OutRaw raw(16);
begin

  vMd5InRaw := utl_raw.cast_to_raw(vDeger);

  dbms_obfuscation_toolkit.MD5(input => vMd5InRaw, checksum => vMd5OutRaw);

  return vMd5OutRaw;

end CreateMd5;

İşlem yapacak olan fonksiyonumuz hazır. Şimdi kontrol işlemlerini yapmak için bir tablo oluşturalım ve içerisine hem normal hemde md5 ile şifrelenmiş verileri ekleyip fonksiyonumuzu kullanarak bu tablodan eşlenen kayıtları bulalım.

create table md5tablo(
  id number,
  normaldeger varchar2(100),
  md5deger varchar2(1000)
);

Tablomuz hazır şimdi içerisine kayıt ekleyelim.

declare
  cursor c is
    select rownum from dual connect by rownum <= 10;

  vDeger md5tablo.normaldeger%type;
  vMd5   md5tablo.md5deger%type;
begin
  for r in c loop
    vDeger := r.rownum || '. değer';
    vMd5   := CreateMd5(vDeger);
    insert into md5tablo
      (id, normaldeger, md5deger)
    values
      (r.rownum, vDeger, vMd5);
  end loop;
  commit;
end;

Tablomuzdaki değerler aşağıdaki gibi olacaktır.

ID NORMALDEGER MD5DEGER
1 1. değer A8E205229129E604F8920C08771474AC
2 2. değer 5654A3F6DF25CBC3218F9078616A7C5E
3 3. değer BB2D5DA75C426590888AB339CCA5F0FD
4 4. değer E0C3AA020F339038098EB61E931B4A33
5 5. değer 5E782B5092DEDAC244C4DFFA3573A698
6 6. değer 0274B6E04CF8548B62C1ED73CA4266D3
7 7. değer 592AFE668D43A02DE8C2D31B69613D58
8 8. değer EC08FDAD9D97656E30FCCB700EA5A909
9 9. değer F8AE7F1E9B1A0139E13AF66E20AAE0FC
10 10. değer AEFF845FA5FE72CD64DD256573B0DA53

Gördüğünüz gibi artık elimizde bazı değerler ve bunlara ait md5 kodları mevcut. Şimdi bu tablodan istediğimiz değeri m5 alanı üzerinden kontrol etmek için md5 değerini çözmeyeceğiz sadece kontrol verimizi md5 ile şifreleyip iki şifreli veriyi kontrol edeceğiz.

select * 
  from md5tablo
 where md5deger=CreateMd5('2. değer');
ID NORMALDEGER MD5DEGER
2 2. değer 5654A3F6DF25CBC3218F9078616A7C5E

Yukarıdaki sorgu sonucunda “2. değer” olan kaydımızı bulmuş olduk. Bir tablomuzda şifreleri sakladığımızı düşünürsek doğru şifre gelip gelmediğini bu yöntemlede kontrol edebiliriz. Kullanıcının şifresi ters yönlü olarak çözülemeyeceği için database ortamınad isteyen hiç kimse bu şifreyi çözemediğinden güvenlik sağlanmış olur. Tek işlem yukardaki gibi benzer işlemler yaparak doğru şifre gelip gelmediğini velen veriyi de md5 ile şifreleyip kontrol etmektedir.

Kolay gelsin.

pl/sql de clob saha içeriğini görüntülemek


Merhaba,
Daha önceki makalemde blob saha içeriğini görüntülenmesini anlatmıştım. Bu makalemde ise clob saha içeriğinin görüntülenmesini anlatacağım.
Öncelikle clob saha içeriğini görüntülemek blob saha içeriğini görüntülemek kadar kolay değil. Biraz convert işlemi yapmamız gerekiyor. Bu convert işleminde clob saha içeriğimizi önce blob saha tipinde veriye dönüştüreceğiz daha sonra da blob saha içeriğini görüntülemek için yaptığımız işlemi yapacağız.
Bu işlemlere başlamadan önce mevcut clob saha içeren tablomuzu sorgulayalım ve sorgu sonucuna bakalım.

SELECT ct_id       "Clob Id Bilgisi",
       ct_aciklama "Clob Açıklama Bilgisi",
       ct_clob     "Clob Saha"
  FROM clob_table ;
Clob Id Bilgisi Clob Açıklama Bilgisi Clob Saha
1 Clob bilgisi açıklama alanı. <CLOB>

Sorgu sonucunda da görüldüğü gibi clob saha içeriğini göremiyoruz. Clob saha içeriğini görebilmek için her sql sorgusunda convert işlemi yazmak yerine bu işlemi bir fonksiyon haline getirip daha kolay ve pratik olarak kullanabiliriz.

CREATE OR REPLACE FUNCTION clob_to_blob(metin CLOB) RETURN BLOB IS
  temp_blob   BLOB;
  dest_offset NUMBER := 1;
  src_offset  NUMBER := 1;
  amount      NUMBER := dbms_lob.lobmaxsize;
  blob_csid   NUMBER := 0;
  lang_ctx    NUMBER := 0;
  warning     NUMBER;
BEGIN
  dbms_lob.createtemporary(temp_blob, TRUE);
  dbms_lob.converttoblob(temp_blob, metin, amount, dest_offset, src_offset, blob_csid, lang_ctx, warning);

  RETURN(temp_blob);
END clob_to_blob;

Fonksiyonumuzu oluşturduktan sonra sql sorgumuzda bu fonksiyonu kullanalım ve clob saha içeriğini görüntüleyelim.

SELECT ct_id "Clob Id Bilgisi",
       ct_aciklama "Clob Açıklama Bilgisi",
       ct_clob "Clob Saha",
       utl_raw.cast_to_varchar2(dbms_lob.substr(clob_to_blob(ct_clob), 4000, 1)) "Clob Saha İçeriği"
  FROM clob_table;

Sql sorgusunu çalıştırdıktan sonra aşağıdaki gibi sonuca ulaşabiliriz.

Clob Id Bilgisi Clob Açıklama Bilgisi Clob Saha Clob Saha İçeriği
1 Clob bilgisi açıklama alanı. <CLOB> Clob saha içeriği.

Sql sorgusunda ve sonucunda da görüleceği gibi öncelikle clob saha içeriğimizi blob saha içeriğine dönüştürdük ve daha sonra blob saha içeriğimizi de varchar2 türünde convert ettik ve kayıt içeriğimizi görüntüledik.
Kolay gelsin.

pl/sql de blob saha içeriğini görüntülemek


Merhaba,
Pl/sql ortamında hazırladığımız programlar için kullandığımız tablolar içinde blob alanlarda sakladığımız verileri yazdığımız normal bir select cümle ile ulaşamayız. Yani blob saha içindeki veriyi göremeyiz. Bu verileri görmek için blob türündeki verilerin içeriğini görmek için bu bilgileri convert etmemiz gerekmektedir. Şimdi blob sahası olan bir tablodan select çekerek sonuçlarını görelim.

SELECT bt_id       "Blob Id Bilgisi",
       bt_aciklama "Blob Açıklama Bilgisi",
       bt_blob     "Blob Saha"
  FROM blob_table;

Bu sql sonucunda aldığımız sonuç aşağıdaki gibi olacaktır.

Blob Id Bilgisi Blob Açıklama Bilgisi Blob Saha
1 Blob bilgisi açıklama alanı <BLOB>

Alınan sql sonucunda görüldüğü gibi blob alan içeriğini göremiyoruz. Bu durumda blob saha bilgisini convert işlemi yapılmadığından sql içinde into ataması ile blob saha değerini de kullanamıyoruz. Ama bu sorunlardan kurtulmak için dbms_lob paketi içindeki substr fonksiyonu ile blob saha içindeki verilerden kaç karakter veri alacağımızı belirttikten sonra , bu fonksiyonun dönüş değeri raw tipinde veri olduğu için bu verinin de varchar2 formatına dönüştürülmesi gerekiyor. Bu dönüşüm işlemi için de utl_raw paketi içindeki cast_to_varchar2 fonksiyonunu kullanacağız. Şimdi bu iki paket içindeki fonksiyonların kullanılarak üst taraftaki sql sonucunun blob saha içindeki değerini görelim.

SELECT bt_id "Blob Id Bilgisi",
       bt_aciklama "Blob Açıklama Bilgisi",
       bt_blob "Blob Saha",
       utl_raw.cast_to_varchar2(dbms_lob.substr(bt_blob, 32000, 1)) "Blob Saha İçeriği"
  FROM blob_table;

Yukarıda sql içerisinde de görüldüğü gibi iki paketin ve bu paketlerin içindeki fonksiyonların kullanımı görülmektedir. Bu sql sorgusunun çıktısı da aşağıdaki gibidir.

Blob Id Bilgisi Blob Açıklama Bilgisi Blob Saha Blob Saha İçeriği
1 Blob bilgisi açıklama alanı <BLOB> Deneme BLOB bilgisi.Bu bilgiyi okumak için dbms_lob paketi içindeki substr[dbms_lob.substr] fonksiyonunu ve utl_raw paketi içindeki cast_to_varchar2[utl_raw.cast_to_varchar2] fonksiyonunu kullanacağız.

Yukarıdaki sql sonucunda da görüldüğü gibi blob sahanın convert işlemini yapılmadan önceki hali ve convert işleminden sonraki durumu görülebilinir.
Kolay gelsin.