Kolon Seviyesinde Şifreleme(Column Level Encryption)

29 Eyl by NURULLAH ÇAKIR

Kolon Seviyesinde Şifreleme(Column Level Encryption)

SQL Server’da önemli bir tablonuzdaki önemli bir kolonunuzun içeriğini kimsenin görmesini istemeyebilirsiniz. Böyle bir durumda bu kolonu şifreli hale getirebilirsiniz. Kolonu şifreli hale getirmek için öncelikle ilgili veritabanında aşağıdaki script yardımıyla master key oluşturmalısınız. Örneğimizde test amaçlı olduğu için basit bir şifre verdik. Production ortama uygularken daha karmaşık bir şifre vermelisiniz.

USE AdventureWorks2014
GO
CREATE MASTER KEY ENCRYPTION BY  
    PASSWORD = 'CLE123' 
GO 

Daha sonra aşağıdaki gibi bir sertifika oluşturuyoruz.

USE AdventureWorks2014
GO
CREATE CERTIFICATE KrediKartiSertifikasi 
   WITH SUBJECT = 'Kredi Kartı Numaraları'; 
GO 

Daha sonra aşağıdaki gibi  Symmetric Key’imizi oluşturuyoruz.

USE AdventureWorks2014
GO
CREATE SYMMETRIC KEY KrediKartKey 
    WITH ALGORITHM = AES_256 
    ENCRYPTION BY CERTIFICATE KrediKartiSertifikasi;

Aşağıdaki gibi şifrelenecek tablomuzu oluşturalım. Bu tabloda KrediKartNo ve KrediKartSifre kolonlarını şifreleyeceğiz. Bu yüzden veri tipi olarak varbinary olarak set ettik. Bunun sebebi veriyi şifrelemek için kullanacağımız ENCRYPTBYKEY fonksiyonunun return type’ının varbinary olması.

USE AdventureWorks2014
GO
CREATE TABLE dbo.KrediKartlari
(
ID int NOT NULL IDENTITY (1, 1),
Ad varchar(200) NOT NULL,
Soyad varchar(200) NOT NULL,
KrediKartNo varbinary(128) NOT NULL
)  ON [PRIMARY]
GO

Şimdi bu tablomuza veri girişi yapmaya çalışalım. Aşağıdaki script’i kullanırsanız tanımlamış olduğunuz symmetric key’i açmadığınız için hata verecektir.

DECLARE @Anahtar AS UNIQUEIDENTIFIER
SET @Anahtar = Key_GUID('KrediKartKey')
IF( @Anahtar is not null )
BEGIN
INSERT INTO [dbo].[KrediKartlari]([Ad],[Soyad],[KrediKartNo]) VALUES ( 'Nurullah','ÇAKIR', encryptbykey( @Anahtar, N'1111-1111-1111-1111'))
INSERT INTO [dbo].[KrediKartlari]([Ad],[Soyad],[KrediKartNo]) VALUES ( 'Faruk','ERDEM', encryptbykey( @Anahtar, N'2222-2222-2222-2222'))
INSERT INTO [dbo].[KrediKartlari]([Ad],[Soyad],[KrediKartNo]) VALUES ( 'Dilara','AYDIN', encryptbykey( @Anahtar, N'3333-3333-3333-3333'))
END
ELSE
BEGIN
PRINT 'Symmetric Key Bulunamadı..'
END

Verdiği hata mesajı şu şekilde olacaktır:

Msg 515, Level 16, State 2, Line 21

Cannot insert the value NULL into column ‘KrediKartNo’, table ‘AdventureWorks2014.dbo.KrediKartlari’; column does not allow nulls. INSERT fails.

Sorgunun başına aşağıdaki script’i :

OPEN SYMMETRIC KEY KrediKartKey  
   DECRYPTION BY CERTIFICATE KrediKartiSertifikasi  ; 

Sorgunun sonuna da aşağıdaki script’i koymalısınız:

CLOSE SYMMETRIC KEY KrediKartKey;

Bu işlemlerin sonucunda kayıtlarımızı eklemiş olduk. Tabloya aşağıdaki gibi select çektiğimizde verilerimizin şifrelenmiş şekilde geldiğini göreceksiniz.

 

Peki bu kolonların şifrelenmemiş hallerine ulaşmak istediğimizde nasıl ulaşacağız?

Aşağıdaki script yardımıyla encrypt edilmiş datayı decrypt ederek açabiliriz.

OPEN SYMMETRIC KEY KrediKartKey 
   DECRYPTION BY CERTIFICATE KrediKartiSertifikasi  ; 
SELECT ID,Ad,Soyad, CONVERT(NVARCHAR, DecryptByKey(KrediKartNo)) as 'Kredi Kartı Numarası'
  FROM [AdventureWorks2014].[dbo].[KrediKartlari]
CLOSE SYMMETRIC KEY KrediKartKey;

Aşağıda da göründüğü üzere verilerimiz orijinal halleri ile gelecektir.

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir