Bir önceki 1-Şifreleme(Encryption)Esasları – Bölüm 1 isimli bölümde şifreleme seviyeleri, çeşitleri,
şifreleme mekanızmasını tetikleyecek nesneleri ve bu nesneleri koruyacak Master
Key’leri konu etmiştik. Bu bölümde ise SQL Server 2012 içerisinde 2 çeşit
şifreleme yönteminden birisi olan Kolon veya Satır Bazlı Şifrelemeye
(Column-Level Encryption) odaklanacağız.
Column-Level Encryption yöntemiyle kolon bazlı verileri
şifreleyebilir bunların hem memoryde hem de diskte şifreli olarak tutulmasını
sağlayabilirsiniz. Böylece veriler temel okuma taleplerinde şifrelenmiş olarak
görünecek. Yazmak istendiğinde ise normal yollarla giriş yapılamayacak.
Veriler üzerinde çalışabilmek için şifreleme mekanizmasını
tetiklemede kullandığımız nesnelere her okuma ve yazma işleminde kesinlikle
ihtiyaç vardır.
Eğer şifrelemek istediğiniz alanlar çok fazla değilse ve bu
alanlar SQL ifadelerinizde çok fazla geçmiyorsa şifreleme metodu olarak
Column-Level Encryption’ı tercih etmek isteyebilirsiniz.
Her yazma/okuma işlemi, mekanızmanın çalışması için
kullanılan password,certificate,symmetric key,asymmetric key nesnelerine
ihtiyaç duymakta. Veri sadece nesneye özel fonksiyonlar yardımıyla şifrelenip
çözülebilir. Bu çalışma şekli kolon sayısı çoğaldıkça paralel olarak programlama
yükünün de artmasına sebep olacaktır.
Encrytion işlemi herhalukarda hem TDE(Transparent Data
Encryption) hem de Column-Level Encryption yöntemlerinde serverın yükünü
arttıracaktır. Eğer gizlemeniz gereken alanlar varsa size iki sorum olacak:
Ne kadar gizlemek istiyorsunuz?
Veritabanının ne kadarını gizlemek istiyorsunuz?
Eğer veritabanında küçük bir bölüm çok önemliyse ve temel bir SELECT komutu ile bile görünmesini istemiyorsanız. O zaman birazdan üzerinde konuşacağımız Column-Level Encryption metodunu tercih etmeniz daha doğru olacaktır.
Metotlar arasındaki ayrıntılı karşılaştırmayı ilerleyen
bölümlerde yapıyor olacagız. Şimdi Column-Level Encrytion yöntemine odaklanalım
ve örneklerimizi bu bölümde değişkenler üzerinden verelim. Örneklerimde aynı
mantıkta scriptler kullanıp aralarındaki farklılıklara odaklanmanızı
amaçlıyorum.
Şifrelemede kullanılan nesneler
Password,Certificate,Symmetric Key, Asymmetric Key dir. Bu nesneler yardımıyla
bir çok şekilde şifreleme yapılabilir. Bu durumu msdn deki şu resim güzelce
açıklamakta. Bu resimdeki kesiksiz oklar genel şifreleme kombinasyonunu
göstermekte. Dışarıdan içeri doğru hiyerarşi gözetilerek farklı kombinasyonlarla
da ilerlenebilir.
Bu resme bakarak örneğin şunu söyleyebilirim;
Verilerin şifrelenmesi için “Symmetric Key” kullanılır. Bu
Symmetric Key’in korunması için bir “Asymmetric Key” kullanılabilir. Bu
Asymmetric Key’in korunması için ise bir “Password” belirtilebilir. Buda ne
böyle diyebilirsiniz. Bu kombinasyonlardan
sadece bir tanesiydi. İsterseniz sadece bir “Password” yardımıyla da şifreleme
mekanizmasını çalıştırmanız mümkün.
Şimdi tek tek bu nesneler önceki bölümde açıkladığımız mekanizmalar
içerisinde nasıl kullanılıyor bir göz atalım. Daha sonra bunları yukarıdaki
kombinasyonları oluşturmak için karma bir şekilde kullanacağız.
1-
T-SQL Fonksiyonu
Arkaplanda
verileri 128 bitlik bir anahtar yardımıyla koruyan TRIPLE DES algoritması
kullanılır. Bu yöntemle metni şifrelemek
için EncryptByPassPhrase fonksiyonu,
şifreli metni çözmek için DecryptByPassPhrase
fonksiyonu kullanılır. Her iki fonksiyon da en az 2 en fazla 4 parametre ile
çalışmaktadır. Örneğin EncryptByPassPhrase fonksiyonuna encrption için
kullanılacak bir şifre ve gizlenecek metin verilerek encription sağlanabilir.
Şifrelenmiş metin ile birlikte ek bir bilgi daha tutmak isterseniz diğer iki
parametreyi de doldurmanız gerekecek. Tabiki metni çözmek istediğinizde
belirttiğiniz şifreye ve bu ek bilgiye ihtiyacınız olacak. Aksi taktirde metni
çözmek istediğinizde sonuç NULL dönecektir.
Fonksiyonlarda
kullanılan parametreleri kısaca açıklayıp bir örnek üzerinde test edelim.
@passphrase :
Encryption için
kullanılacak herhangi bir şifredir.Fonksiyon şifrenin karmaşıklığını kontrol
etmez. Veritipi olarak nvarchar,char,binary,varbinary veya nchar kullanılabilir.
Sistem bu şifreden arkaplanda bir symmetric key elde eder.
@cleartext :
Gizlemek istediğimiz temiz
metin. @passphrase parametresinde kullanılan veri tipleri aynen burada da
geçerli.
@chippertext:
Encrption sonucunda elde
edilmiş varbinary tipindeki değerdir. Veri tipinden dolayı büyüklüğü en fazla
8,000 byte olabilir.
@add_authenticator:
Temiz metin ile birlikte
ek bir bilgi daha tutmak istersek bu parametreye int tipinde 1 değerini atamalıyız.
Örnek olarak müşterilerin isimlerini TC kimlik numaraları ile birlikte
gizleyebiliriz. Böylece metni çözmek için her iki bilgiyi de zorunlu kılmış
oluruz.
@authenticator:
Metin ile birlikte
gizlemek istediğimiz veridir. Bu durumda yukarıdaki örneğe göre TC kimlik
numarasına tekabül ediyor.
Şimdi her iki
fonksiyonu da bir örnek üzerinde görelim
DECLARE @veri varchar(max),
@sifreli varbinary(max),
@cozulmus varchar(max)
---
SET @veri='Temiz metin'
SET @sifreli =
EncryptByPassPhrase('pass@word1', --@passphrase
@veri, --@cleartext
1, --@add_authenticator
'ekBilgi') --@authenticator
SET @cozulmus=
DecryptByPassPhrase(
'pass@word1', --@passphrase
@sifreli, --@cleartext
1, --@add_authenticator
'ekBilgi' --@authenticator
)
SELECT
@veri as 'Girilen Veri',
@sifreli as 'Sifrelenmis Hali',
@cozulmus as 'Cozulmus Hali'
Bu örnekte fonksiyonların işleyişine odaklanalım diye
değişkenler üzerinden ilerledik. Gerçek hayat örneğinde tablodaki gizlemek
istediğimiz kolonları bu fonksiyonlar yardımıyla şifreleyebilir ve şifreli
sonucu varbinary bir kolona basabiliriz. Böyle bir örneği mekanızmaların tümünü
inceledikten sonra yapıyor olacağız.
Kolon veya satır bazlı şifreleme (Column-Level Encryption)
kapsamında kullanılan 4 mekanıznın ilki olan T-SQL Functions yöntemini incemiş
olduk. Yazıyı çok fazla uzatmamak için Certificates, Asymmetric Keys, Symmetric
Keys isimli diğer 3 yöntemi de bir sonraki bölüme bırakıyorum.
Faydalı olması dileğiyle.