Oracle 11g R2’de SHA-256 ile Veri Hashleme

Herkese Selam,

Bu yazıda Oracle 11g R2 veritabanı üzerinde SHA-256 metodu ile veri hashleyeceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

Bilindiği üzere Oracle veritabanı içerisinde şifreleme ve hashing ile ilgili bazı destekler sunuyor. Oracle’ın sunmuş olduğu bu alt yapıdan faydalanmak, bu tarz ihtiyaçlarımızın olduğu durumlarda işimizi oldukça hızlandırıyor ve etkin bir şekilde çözmemize olanak sağlıyor.

Oracle 11g R2 ile sunulan at yapıya bakacak olursak bir çok yöntemin kullanıcılara sunulduğunu görmekteyiz.

Listeye baktığımızda Oracle 11g R2 ile sunulan alt yapıda bazı yöntemlerin olmadığını görmekteyiz. Bu yöntemlerden biride SHA-256 Hashing algoritması. Oracle 12c ile bu destek var ancak elimizdeki veritabanı Oracle 11g R2 ise ve veritabanımızı upgrade etme opsiyonumuz yok ise bu yöntemi workaround bir şekilde datamız üzerine uygulayabiliriz.

Bu yöntemi uygulamak için Oracle veritabanı içerisinde Java Class yaratabilme ve bunu SQL içerisinde kullanabilme alt yapısından faydalanacağım.  Yani özet olarak veriyi hashleme işlemini, veritabanı içerisinde yazacağım bir java kodu yardımı ile yapacağım. Daha sonra bu java kodunu bir PL/SQL fonksiyonu ile wrap edip normal bir SQL fonksiyonu olarak kullanacağım.

İlk olarak SHA-256 metodunu uygulayacak Java Classını veritabanı içerisinde  yaratalım.

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED test."calcsha"
   AS import java.security.MessageDigest; 
public class calcsha2 
{
    static public String fncsha(String inputVal) throws Exception
    {           
        MessageDigest myDigest = MessageDigest.getInstance("SHA-256");        
        myDigest.update(inputVal.getBytes());
        byte[] dataBytes = myDigest.digest();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < dataBytes.length; i++) {
         sb.append(Integer.toString((dataBytes[i])).substring(1));
        }        
        
        StringBuffer hexString = new StringBuffer();
        for (int i=0;i<dataBytes.length;i++) {
            String hex=Integer.toHexString(0xff & dataBytes[i]);
                if(hex.length()==1) hexString.append('0');
                hexString.append(hex);
        }
        String retParam = hexString.toString();
        return retParam;           
    }    
}

Veritabanı içerisinde java kaynağımızı create ettik. Şimdi bu kaynağı wrap edecek PL/SQL fonksiyonunu yazalım.

CREATE OR REPLACE FUNCTION test.hash_sha256 (txt varchar2)
RETURN VARCHAR2
AS
LANGUAGE JAVA
NAME 'calcsha2.fncsha(java.lang.String) return String';

PL/SQL fonksiyonunu yazdık. Şimdi yazdığımız alt yapıyı test edebiliriz.

select hash_sha256('123456789') from dual;

HASH_SHA256('123456789')                                                        
-----------------------------------------------------------------
15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225                
1 row selected.

Evet bu örnek ile Oracle 11g R2 ile desteklenmeyen bir hashleme yöntemini workaround bir şekilde kullanmış olduk.

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 )

Google+ photo

You are commenting using your Google+ 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 )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.