‫ رمز گذاری در SQL Server : مجله اينترنتي نت سايت‬

رمز گذاری در SQL Server

SQL Server 2005 و SQL Server 2008 از یک ویژگی جدید برای رمز گزاری داده ها استفاده می کنند تا از داده ها در مقابل هکر ها محافظت نمایند . هکر ها ممکن است بتوانند در پایگاه داده یا جداول رخنه کنند ، اما با استفاده از رمز گذاری آنها نمی توانند از داده چیزی بفهمند یا از آن استفاده کنند . امروزه رمز گذاری داده های حساس امری ضروری به نظر می رسد زیرا تا زمانی که داده ها بین کلاینت و سرور در شبکه جابه جا می شوند امکان مشاهده انها وجود دارد .

Microsoft-SQL-Server-Database

رمز گذاری در سه سطح امکان پذیر است . این سه سطح مکانیزم های مختلفی برای امنیت داده روی شبکه و سرور های محلی فراهم می کنند . سطح های مختلف اجازه می دهند چندین instance از سرویس ها (برای مثال سرویس های SQL Server) روی یک سرور فیزیکی اجرا شوند .

  • Windows Level – بالاترین سطح می باشد . از توابع Windows DP API برای رمز گذاری استفاده می کند.
  • SQL Server Level – سطح میانی می باشد . از سرویس های Master Key برای رمز گذاری استفاده می کند .
  • Database Level – پایین ترین سطح می باشد . از دیتابیس Master Key برای رمز گذاری استفاده می کند .

در رمز گذاری ۲ نوع کلید وجود دارد :

· کلید متقارن (symmetric) : در سیستم رمزگذاری متقارن فرستنده و گیرنده یک پیام یک کلید مشترک را بین خود به اشتراک می گذارند که از آن برای رمز کردن پیام و شکستن رمز استفاده می شود . این شیوه پیاده سازی نسبتا آسانی دارد و هردو فرستنده و گیرنده می توانند پیام را رمز گذاری ورمز گشایی کنند .

· کلید نامتقارن (Asymmetric) : در این شیوه فرستنده و گیرنده یک جفت کلید عمومی و اختصاصی دارند که با استفاده از آنها رمزگذاری و رمزگشایی می کنند . این سیستم کمی پیچیده می باشد زیرا فرستنده می تواند از کلیدش استفاده کند پیام را رمز کند اما نمی تواند آن را رمز گشایی کند ، از طرف دیگر گیرنده می تواند با استفاده از کلیدش رمز گشایی کند اما نمی تواند رمز کند .

دو نوع رمز گذاری در SQL وجود دارد :

· سطح دیتابیس (Database Level) : دراین سطح تمام داده های دیتابیس به صورت امن رمزنگاری می شوند . اما هر بار که داده به خوانده یا نوشته می شود در دیتابیس ، تمام دیتابیس نیاز دارد تا رمزگشایی شود . این روش بسیار هزینه بر می باشد و یک راهکار واقعی نمی باشد .

· سطح ستون (یا سطر) : این روش به روش قبلی ارجحیت دارد ، زیرا تنها ستونهایی که شامل اطلاعات حساس و مهم هستند رمزنگاری می شوند . این شیوه در مقایسه با شبوه قبلی مصرف CPU را به شدت کاهش می دهد . اگر یک ستون کلید اصلی باشد یا ستونی باشد که در قسمت WHERE کویری ها یا Join ها استفاده می شود دیتابیس باید تمام ستون را رمزگشایی کند که هزینه زیادی در بر دارد .

حال با مثالی چگونگی رمزنگاری در SQL Server را مشاهده خواهید کرد . در مثال زیر از روش متقارن و الگوریتم Triple DES استفاده شده است . ابتدا یک دیتابیس نمونه می سازیم :

/* Create Database */
USE master
GO
CREATE DATABASE EncryptTest

GO

ابتدا یک جدول با چندین رکورد داده می سازیم . سپس یکی از ستون های جدول را رمز می کنیم .

/* Create table and insert data in the table */
USE EncryptTest
GO
CREATE TABLE TestTable (FirstCol INT, SecondCol VARCHAR(50))
GO
INSERT INTO TestTable (FirstCol, SecondCol)
SELECT 1,’First’
UNION ALL
SELECT 2,’Second’
UNION ALL
SELECT 3,’Third’
UNION ALL
SELECT 4,’Fourth’
UNION ALL
SELECT 5,’Fifth’
GO
/* Check the content of the TestTable */
USE EncryptTest
GO
SELECT *
FROM TestTable
GO

هر دیتابیس می تواند یک شاه کلید (Master Key) داشته باشد . شاه کلید دیتابیس یک کلید متقارن است که برای محافظت از کلیدهای اختصاصی و کلیدهای نامنقارن موجود در دیتابیس از آن استفاده می شود . شاه کلید از الگوریتم Triple DES همراه با رمز عبور کاربر برای رمز کردن کلید ها استفاده می کند .

/* Create Database Master Key */
USE EncryptTest
GO
CREATE MASTER KEY ENCRYPTION
BY PASSWORD = ‘MyEncryption’
GO

گواهینامه ها (Certificates) برای محافظت از کلیدهای رمز نگاری استفاده می شوند . SQL این قابلیت را دارد تا گواهینامه های self-signed X.509 را تولید کند .

/* Create Encryption Certificate */
USE EncryptTest
GO
CREATE CERTIFICATE EncryptTestCert
WITH SUBJECT = ‘MyEncryption’
GO

کلید متقارن به وسیله روش های گوناگونی مانند گواهینامه ، رمز عبور ، کلید متقارن و کلید نامتقارن رمز می شود . الگوریتم های متفاوتی می تواند برای رمز کردن کلید استفاده شود . الگوریتم هایی که پشتیبانی می شوند DES, TRIPLE_DES, RC2, RC4, RC4_128, DESX, AES_128, AES_192, و AES_256 می باشند .

/* Create Symmetric Key */
USE EncryptTest
GO
CREATE SYMMETRIC KEY TestTableKey
WITH ALGORITHM = TRIPLE_DES ENCRYPTION
BY CERTIFICATE EncryptTestCert
GO

حال یک ستون از نوع varbinary به جدول اصلی اضافه می کنیم که مقدار رمز شده فیلد SecondCol را نگه می دارد .

/* Encrypt Data using Key and Certificate
Add Columns which will hold the encrypted data in binary */
USE EncryptTest
GO
ALTER TABLE TestTable
ADD EncryptSecondCol VARBINARY(256)
GO

قبل از اینکه از کلید استفاده شود باید با همان شیوه ای که رمز شده رمز گشایی شود . در مثال ما ، ما از یک گواهینامه برای رمزکردن کلید استفاده کردیم . پس از همان گواهینامه برای باز کردن کلید استفاده می کنیم. پس از اینکه کلید باز شد و قابل استفاده شد ، می توانیم برای ذخیره مقادیر رمز شده در دیتابیس از تابع EncryptKey استفاده کنیم .

/* Update binary column with encrypted data created by certificate and key */
USE EncryptTest
GO
OPEN SYMMETRIC KEY TestTableKey DECRYPTION
BY CERTIFICATE EncryptTestCert
UPDATE TestTable
SET EncryptSecondCol = ENCRYPTBYKEY(KEY_GUID(‘TestTableKey’),SecondCol)
GO

حال می توانیم ستون SecondCol را Drop کنیم زیرا مقادیر آن به صورت رمز شده در ستونEncryptSecondCol وجود دارند. اگر ستون را حذف نکنید می توانید وقتی داده رمز گشایی شد از آن برای تست صحت عملیات استفاده کنید .

/* DROP original column which was encrypted for protect the data */
USE EncryptTest
GO
ALTER TABLE TestTable
DROP COLUMN SecondCol
GO

حال با یک SELECT ساده می توانیم ببینیم آیا داده های ما به خوبی رمز شده اند یا خیر . اکنون اگر هکر ها راهی برای رسیدن به داده ها داشته باشند امکان استفاده از آن را ندارند .

/* Check the content of the TestTable */
USE EncryptTest
GO
SELECT *
FROM TestTable
GO

کاربرانی که اعتبار سنجی شده اند می توانند از تابع DecryptbyKey برای بازگرداندن داده اصلی از داده رمز شده استفاده کنند . اگر کلید متقارن برای رمزگشایی باز نشده باشد ، باید از گواهینامه ای که کلید را با آن رمزکرده ایم استفاده کنیم . نکته مهم در اینجا این است که ستون اصلی و ستون رمز گشایی شده باید یک DataType داشته باشند . اگر DataType های متفاوتی داشته باشند ممکن است مقادیر متفاوتی تولید شود . در مثال ما ستون SecondCol نوع داده اش Varchar بود .

/* Decrypt the data of the SecondCol */
USE EncryptTest
GO
OPEN SYMMETRIC KEY TestTableKey DECRYPTION
BY CERTIFICATE EncryptTestCert
SELECT CONVERT(VARCHAR(50),DECRYPTBYKEY(EncryptSecondCol)) AS DecryptSecondCol
FROM TestTable
GO

دقت کنید بعد از استفاده از کلید حتما آن را ببندید . اگر کلید ها و گواهینامه ها فقط یک بار استفاده شده اند یا دیگر استفاده نمی شوند بهتر است آن ها را حذف کنید .

/* Clean up database */
USE EncryptTest
GO
CLOSE SYMMETRIC KEY TestTableKey
GO
DROP SYMMETRIC KEY TestTableKey
GO
DROP CERTIFICATE EncryptTestCert
GO
DROP MASTER KEY
GO

خلاصه

رمز نگاری یک ویژگی مهم امنیتی در SQL می باشد . کلید های بزرگتر و نامتقارن باعث ایجاد رمزنگاری غیرقابل حمله و قویتری می شوند که این خود باعث مصرف بیشتر CPU می شود . وفتی حجم زیادی از داده برای رمزنگاری وجود دارد ، توصیه می شود از کلید متقارن استفاده شود . از آنجایی که داده رمز شده نمی تواند فشرده (Compress) شود توصیه می شود قبل از رمز نگاری داده تا حد ممکن فشرده شود .

دیدگاه خود را بنویسید


*