یکی از مهمترین کارها در SQL ایجاد امنیت برای دیتابیسها و ستونهای جدول آن است که با این کار دسترسی به اطلاعات دیتابیس کار هرکسی نخواهد بود و طرف باید رمز عبور و گواهینامه موردنیاز را داشته باشد.
مثلاً شما در جدول خود یک ستون دارید که نمیخواهید کس دیگری بتواند اطلاعات آن را مشاهده کند و شما با داشتن رمز عبور و گواهینامه مورد نظر میتونید اطلاعات را مشاهده کنید.
رمزنگاری یا همان Cryptography به دانشی گفته میشود که در آن اطلاعات بهصورت یک کلید رمزنگاری میشود که این کار توسط الگوریتم مربوط به آن انجام میشود و فقط کسی میتواند از این اطلاعات استفاده کند که اطلاعات لازم مانند کلید و الگوریتم مربوط به آن را بداند.
شکل ۲۵-۴ رمزنگاری
بررسی برخی از اصطلاحات
Decryption
برای آشکارسازی اطلاعات Encryption شده مورداستفاده قرار میگیرد و نام آن را رمزگشایی هم مینامند.
Plain text
متن اولیه که رمزنگاری نشده و یک رمز آشکار است و مهاجمان بهراحتی میتوانند به آن دست پیدا کنند.
Cipher
الگوریتمی برای رمزگذاری و رمزشکنی است و از سرعت عمل خوبی برخوردار است.
Cryptanalysis
به بازکردن قفلهای Cipher گفته میشود یا خواندن متن قفلشدهی آن.
۱-۴-۴ کلیدهای متقارن (Symmetric) و نامتقارن (Asymmetric)
رمزنگاری کلید متقارن
رمزنگاری کلید متقارن یا تک کلیدی، به آن دسته از الگوریتمها، پروتکلها و سیستمهای رمزنگاری گفته میشود که در آن هر دو طرف ردوبدل اطلاعات از یک کلید رمز یکسان برای عملیات رمزگذاری و رمزگشایی استفاده میکنند. در این قبیل سیستمها، یا کلیدهای رمزگذاری و رمزگشایی یکسان هستند یا با رابطهای بسیار ساده از یکدیگر قابل استخراج هستند.
واضح است که در این نوع از رمزنگاری، باید یک کلید رمز مشترک بین دو طرف تعریف گردد. چون کلید رمز باید کاملاً محرمانه باقی بماند، برای ایجاد و ردوبدل کلید رمز مشترک باید از کانال امن استفاده نمود یا از روشهای رمزنگاری نامتقارن استفاده کرد. نیاز به وجود یک کلید رمز بهازای هر دو نفرِ درگیر در رمزنگاری متقارن، موجب بروز مشکلاتی در مدیریت کلیدهای رمز میگردد.
الگوریتمهایی که در Symmetric به کار میرود عبارتاند از:
- DES
- ۳DES
- AES
- IDEA
- RC2, RC4, RC5, RC6
- Blowfish
شکل ۲۶-۴ رمزنگاری
رمزنگاری کلید نامتقارن
رمزنگاری کلید نامتقارن، در ابتدا با هدف حل مشکل انتقال کلید در روش متقارن پیشنهاد شد. در این نوع از رمزنگاری، بهجای یک کلید مشترک، از یک زوج کلید به نامهای کلید عمومی و کلید خصوصی استفاده میشود. کلید خصوصی تنها در اختیار دارنده آن قرار دارد و امنیت رمزنگاری به محرمانه بودن کلید خصوصی بستگی دارد. کلید عمومی در اختیار کلیه کسانی که با دارنده آن در ارتباط هستند قرار داده میشود.
بهمرورزمان، بهغیراز حل مشکل انتقال کلید در روش متقارن، کاربردهای متعددی برای این نوع از رمزنگاری مطرح گردیده است. در سیستمهای رمزنگاری نامتقارن، بسته به کاربرد و پروتکل مورد نظر، گاهی از کلید عمومی برای رمزگذاری و از کلید خصوصی برای رمزگشایی استفاده میشود و گاهی نیز، برعکس، کلید خصوصی برای رمزگذاری و کلید عمومی برای رمزگشایی به کار میرود.
دو کلید عمومی و خصوصی با یکدیگر متفاوت هستند و با استفاده از روابط خاص ریاضی محاسبه میگردند. رابطه ریاضی بین این دو کلید بهگونهای است که کشف کلید خصوصی با در اختیار داشتن کلید عمومی، عملاً ناممکن است.
الگوریتمهایی که در Asymmetric به کار میروند عبارتاند از:
- RSA
- DH
- ElGamal
- DSA
- ECC
مقایسه رمزنگاری کلید متقارن و کلید نامتقارن
اصولاً رمزنگاری کلید متقارن و کلید نامتقارن دارای دو ماهیت متفاوت هستند و کاربردهای متفاوتی نیز دارند؛ بنابراین مقایسه این دو نوع رمزنگاری بدون توجه به کاربرد و سیستم مورد نظر کار دقیقی نخواهد بود. اما اگر معیار مقایسه، بهطور خاص، حجم و زمان محاسبات موردنیاز باشد، باید گفت که با درنظرگرفتن مقیاس امنیتی معادل، الگوریتمهای رمزنگاری متقارن خیلی سریعتر از الگوریتمهای رمزنگاری نامتقارن میباشند.
۴-۴-۲ هش کردن (Hashing)
در این روش یک ورودی از اطلاعات دریافت میشود و بعد از اجرای یک الگوریتم بر روی آن ورودی تبدیل به اعداد و حروف خواهد شد که در شکل ۲۷-۴ این موضوع را مشاهده میکنید که مثلاً با ورود عدد ۰۰۰ و اعمال الگوریتم هش روی آن کد نهایی آن بهصورت کامل تغییر کرده و هک کردن آن کاملاً سخت شده است.
شکل ۲۷-۴ هشینگ
انواع الگوریتمهای هش عبارتاند از:
نوع الگوریتم | اندازه |
BLAKE-256 | ۲۵۶ bits |
BLAKE-512 | ۵۱۲ bits |
BLAKE2s | Up to 256 bits |
BLAKE2b | Up to 512 bits |
ECOH | ۲۲۴ to 512 bits |
FSB | ۱۶۰ to 512 bits |
GOST | ۲۵۶ bits |
Grøstl | Up to 512 bits |
HAS-160 | ۱۶۰ bits |
HAVAL | ۱۲۸ to 256 bits |
JH | ۲۲۴ to 512 bits |
MD2 | ۱۲۸ bits |
MD4 | ۱۲۸ bits |
MD5 | ۱۲۸ bits |
MD6 | Up to 512 bits |
RadioGatún | Up to 1216 bits |
RIPEMD | ۱۲۸ bits |
RIPEMD-128 | ۱۲۸ bits |
RIPEMD-160 | ۱۶۰ bits |
RIPEMD-320 | ۳۲۰ bits |
SHA-1 | ۱۶۰ bits |
SHA-224 | ۲۲۴ bits |
SHA-256 | ۲۵۶ bits |
SHA-384 | ۳۸۴ bits |
SHA-512 | ۵۱۲ bits |
SHA-3 (originally known as Keccak) | arbitrary |
Skein | arbitrary |
Snefru | ۱۲۸ or 256 bits |
Spectral Hash | ۵۱۲ bits |
Streebog | ۲۵۶ or 512 bits |
SWIFFT | ۵۱۲ bits |
Tiger | ۱۹۲ bits |
Whirlpool | ۵۱۲ bits |
از بین این الگوریتمها بیشترین استفاده از الگوریتمهای MD5، SHA1، SHA2 میشود.
۴-۴-۳ رمزگذاری بر روی ستونهای جداول در SQL
امنیت داده برای هر سازمانی یک کار اساسی و مهم است، بهخصوص اگر اطلاعات شخصی مشتری مانند شماره تماس، آدرس ایمیل، شماره تأمین اجتماعی، شماره کارتهای بانکی و اعتباری را ذخیره کنید. هدف اصلی ما محافظت از دسترسی غیرمجاز به دادهها در داخل و خارج از سازمان است. برای دستیابی به این هدفSQL Server راهحلهای رمزگذاری ارائه میدهد. ما میتوانیم از این رمزگذاریها استفاده کنیم و از دادهها محافظت کنیم.
برای شروع کار میخواهیم یک دیتابیس جدید ایجاد کنیم و یکی از ستونهای آن را رمزنگاری کنیم، برای اینکه یک دیتابیس جدید ایجاد کنیم میتوانید از دستور زیر استفاده کنید:
CREATE DATABASE CustomerData;
Go
USE CustomerData;
GO
CREATE TABLE CustomerData.dbo.CustomerInfo
(CustID INT PRIMARY KEY,
CustName VARCHAR(30) NOT NULL,
BankACCNumber VARCHAR(10) NOT NULL
);
GO
با اجرای دستورات بالا یک دیتابیس جدید با نام CoustomerData ایجاد شده است و در ادامه دستورات یک جدول با نام CustomerInfo هم داخل دیتابیس CoustomerData ایجاد شده که دارای سه ستون است که در شکل ۲۸-۴ این موضوع را مشاهده میکنید.
شکل ۲۸-۴ ایجاد جدول و دیتابیس
برای اینکه اطلاعات جدول را تکمیل کنیم میتوانید از دستورات زیر استفاده کنید:
Insert into CustomerData.dbo.CustomerInfo (CustID,CustName,BankACCNumber)
Select ۱,'Rajendra',11111111 UNION ALL
Select ۲, 'Manoj',22222222 UNION ALL
Select ۳, 'Shyam',33333333 UNION ALL
Select ۴,'Akshita',44444444 UNION ALL
Select ۵, 'Kashish',55555555
با دستور بالا اطلاعات جدول CustomerInfo کامل خواهد شد که در شکل ۲۹-۲ این موضوع را مشاهده میکنید.
شکل ۲۹-۴ خروجی جدول CustomerInfo
از مراحل زیر برای رمزگذاری سطح ستون استفاده میکنیم:
- یک کلید اصلی یا همان master keyبرای پایگاهداده ایجاد کنید.
- برای SQL Server یک گواهینامه خود امضا ایجاد کنید.
- یک کلید متقارن را برای رمزگذاری پیکربندی کنید.
- رمزگذاری دادههای ستون.
- رمزگذاری را جستجو و تأیید کنید.
برای انجام این مراحل دقیقاً طبق دستورات زیر پیش بروید تا مشکلی در کار پیش نیاید.
اگر به شکل ۳۶-۴ توجه کنید، یک نمای کلی از ایجاد رمزگذاری در SQL Server را مشاهده میکنید.
شکل ۳۶-۴ نمودار رمزگذاری
۴-۴-۳-۱ ایجاد Master Key برای رمزگذاری رو ستون
برای شروع یک Master Key تعریف و یک رمز عبور برای محافظت آن مشخص میکنیم که این کلید یک کلید متقارن است که برای محافظت از کلیدهای خصوصی و کلید نامتقارن تعریف میشود که در شکل ۳۶-۴ هم مشخص شده است.
برای ایجاد یک کلید اصلی (Master Key) پایگاهداده از عبارت CREATE MASTER KEY استفاده میکنیم:
USE CustomerData;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Test@12345';
برای اینکه متوجه شویم دستور بالا بهدرستی اجرا شده است باید از دستور زیر استفاده کنیم:
SELECT name KeyName,
symmetric_key_id KeyID,
key_length KeyLength,
algorithm_desc KeyAlgorithm
FROM sys.symmetric_keys;
همانطور که در شکل ۳۷-۴ مشاهده میکنید با اجرای دستورات بالا یک View با ستونهای مشخص شده در خروجی به نمایش گذاشته شد که مقدار sys.symetric_keys را نمایش میدهد که اگر به ستون الگوریتم توجه کنید الگوریتم ما از نوع AES و با اندازه ۲۵۶ است که یک رمزنگاری قدرتمند را ارائه میدهد، به این نکته هم توجه کنید که خود SQL نوع الگوریتم به همراه طول آن را بهصورت اتوماتیک ایجاد میکند.
شکل ۳۷-۴
۴-۴-۳-۲ ایجاد Certificate در SQL
در ادامه کار باید یک گواهینامه خود امضا یا همان self-signed ایجاد کنیم منظور از گواهینامههای خود امضاء این است که ای گواهینامه داخل خود SQL ایجاد میشود و هیچ سازمان دیگری آن را تولید نمیکند یعنی دیگر SQL نیاز ندارد گواهینامه مرجع تولید شده از سازمان دیگر استفاده کند بلکه خودش تولید و استفاده میکند.
USE CustomerData;
GO
CREATE CERTIFICATE Certificate_test WITH SUBJECT = 'Protect my data';
GO
در دستور بالا اول به دیتابیس CustomerData متصل شدیم و بعد یک گواهینامهی جدید با نام Certificate_test ایجاد کردیم که موضوع آن Protect my data است و اگر به شکل ۳۸-۴ توجه کنید این موضوع را مشاهده خواهید کرد.
شکل ۳۸-۴ ایجاد Certificate
برای اینکه مطمئن شویم کار بهدرستی انجامگرفته میتوانیم از دستورات زیر استفاده کنیم:
SELECT name CertName,
certificate_id CertID,
pvt_key_encryption_type_desc EncryptType,
issuer_name Issuer
FROM sys.certificates;
اگر به شکل ۳۹-۴ توجه کنید متوجه خواهید شد که Certificate مورد نظر بهدرستی ایجاد شده است.
شکل ۳۹-۴ نمایش Certificate
پس اگر به ستونهای شکل ۳۹-۴ توجه کنید در قسمت Encrypt Type مقدار ENCRYPTED_BY_MASTER_KEY قرار گرفته است که نشان میدهد SQL از کلیدی که ایجاد کردیم در حال استفاده است، در ستون Certname هم که نام Certificate قرار میگیرد، و در ستون Issuer باید نام سازمان صادرکننده گواهینامه نوشته شود که در اینجا چون خود SQL صادرکننده آن است یک نوشته خودمان قرار دادیم.
۴-۴-۳-۳ ایجاد کلید متقارن
در مرحله بعد کار باید یک کلید متقارن ایجاد کنیم، در مورد کلید متقارن در قسمتهای قبل توضیح دادیم، در کل کلید متقارن برای رمزگذاری و رمزگشایی استفاده میکند.
برای شروع باید از دستور زیر استفاده کنید:
CREATE SYMMETRIC KEY SymKey_test WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE Certificate_test;
در دستور بالا SymKey_test نام کلید متقارن است که باید ایجاد کنیم و AES_256 همان طول و نوع رمزنگاری است که مشخص شده است و در آخر باید نام Cerfitficate که در قسمت قبل ایجاد کردیم را وارد کنید.
برای اینکه متوجه شویم دستور بهدرستی اجرا شده میتوانیم از دستورات زیر استفاده کنیم:
SELECT name KeyName,
symmetric_key_id KeyID,
key_length KeyLength,
algorithm_desc KeyAlgorithm
FROM sys.symmetric_keys;
همانطور که در شکل ۴۰-۴ مشاهده میکنید کلید متقارن هم به همراه کلید Master ایجاد شده است.
شکل ۴۰-۴ نمایش کلید متقارن
خوب تا به اینجای کار توانستیم کلیدهای رمزگذاری مورد نظر را برای این نسخه از دیتابیس ایجاد کنیم و روش ایجاد آن بهمانند شکل ۳۶-۴ است یعنی اینکه SQL Server یک Service Master Key (SMK) ایجاد میکند و بعد از آن سیستمعامل Windows Data Protection API (DPAPI) از کلید Service Master Key (SMK) محافظت میکند، توجه داشته باشیم که کلید اصلی سرویس (SMK) از کلید اصلی پایگاهداده (DMK) محافظت میکند کلید اصلی پایگاهداده (DMK) از گواهی خود امضا شده که همان Certificate باشد محافظت میکند و این گواهینامه یا همان Certificate از کلید Symmetric محافظت میکند. این شد مراحل کار تا به اینجا.
۴-۴-۳-۴ رمزگذاری داده
برای اینکه یک ستون در SQL رمزگذاری شود باید نوع داده را VARBINARY(max) در نظر بگیریم، برای این کار و در دیتابیس CustomerData یک ستون جدید با نام BankACCNumber_encrypt ایجاد و نوع آن را varbinary(MAX) در نظر میگیریم.
ALTER TABLE CustomerData.dbo.CustomerInfo
ADD BankACCNumber_encrypt varbinary(MAX)
همانطور که در شکل ۴۱-۴ مشاهده میکنید ستون مورد نظر با موفقیت ایجاد شده است.
شکل ۴۱-۴ ایجاد ستون در جدول
در ادامه میخواهیم کار اصلی را انجام دهیم، یعنی اینکه دادههایی که در ستون BankACCNumber_encrypt که در بالا ایجاد کردیم قرار میگیرند را رمزنگاری کنیم.
پس برای این کار باید از همان کلید متقارن و گواهینامه قبلی که ایجاد کردیم استفاده کنیم، با دستور زیر کلید و گواهینامه را فعال میکنیم که در شکل ۴۲-۴ این موضوع مشخص شده است.
OPEN SYMMETRIC KEY SymKey_test
DECRYPTION BY CERTIFICATE Certificate_test;
شکل ۴۲-۴ بازکردن کلید و گواهینامه
در ادامه کار اطلاعات موجود در ستون BankACCNumber را درون ستون جدیدی که با نام BankACCNumber_encrypt است قرار میدهیم البته با استفاده از کلید متقارن که ایجاد کردیم این کار را انجام میدهیم.
UPDATE CustomerData.dbo.CustomerInfo
SET BankACCNumber_encrypt = EncryptByKey (Key_GUID('SymKey_test'), BankACCNumber)
FROM CustomerData.dbo.CustomerInfo;
GO
در ادامه باید کلید متقارن که باز کردید را ببندید که باید از این دستور استفاده کنید:
CLOSE SYMMETRIC KEY SymKey_test;
GO
حالا میتوانیم با استفاده از دستور زیر خروجی کار را مشاهده کنیم:
SELECT *
FROM CustomerInfo;
همانطور که در شکل ۴۳-۴ مشاهده میکنید ستون جدید ایجاد شده و اطلاعاتی که داخل آن قرار گرفتهاند رمزنگاری شده و کسی نمیتواند از اطلاعات را مشاهده کند.
شکل ۴۳-۴ نمایش جدول
تا اینجا توانستیم یک ستون از جدول را رمزگذاری کنیم تا کسی نتواند اطلاعات آن را مشاهده کند، اما اگر بخواهیم این اطلاعات را مشاهده کنیم یعنی رمزگشایی یا همان Decrypt کنیم چه کاری باید انجام دهیم؟
برای این کار باید از دستور DecryptByKey استفاده کنیم، برای تست این موضوع به دستورات زیر دقت کنید:
اولین کاری که انجام میدهیم کلید متقارن و گواهینامه مورد نظر را صدا میزنیم:
OPEN SYMMETRIC KEY SymKey_test
DECRYPTION BY CERTIFICATE Certificate_test;
بعد از بازکردن موارد مورد نظر باید از دستورات زیر استفاده کنید:
SELECT CustID, CustName,BankACCNumber_encrypt AS 'Encrypted data',
CONVERT(varchar, DecryptByKey(BankACCNumber_encrypt)) AS 'Decrypted Bank account number'
FROM CustomerData.dbo.CustomerInfo;
در دستورات بالا ستونهای جدول مورد نظر انتخاب شدهاند ولی در ستون BankACCNumber_encrypt با استفاده از دستور AS به ستون Encrypted data تغییر نام پیدا کرد و همین ستون با استفاده از دستور DecryptByKey اطلاعات آن به ستون جدید با نام Decrypted Bank account number رمزگشایی شد که این موضوع را در شکل ۴۴-۴ مشاهده میکنید:
شکل ۴۴-۴ رمزگشایی ستون
بعد از رمزگذاری و رمزگشایی، حالا میخواهیم تست بگیریم که هر کاربری با هر دسترسی میتواند این عملیات را انجام دهد یا نه، برای تست این موضوع با استفاده از دستورات زیر یک کاربر جدید با نام DEC-USER ایجاد میکنیم که به دیتابیس CustomerData دسترسی db_datareader دارد یعنی فقط میتواند اطلاعات را بخواند.
USE [master]
GO
CREATE LOGIN [DEC-USER] WITH PASSWORD=N'Test@12345', DEFAULT_DATABASE=[CustomerData], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [CustomerData]
GO
CREATE USER [DEC-USER] FOR LOGIN [DEC-USER]
GO
USE [CustomerData]
GO
ALTER ROLE [db_datareader] ADD MEMBER [DEC-USER]
GO
بعد از ایجاد کاربر DEC-USER باید با این کاربر بهمانند شکل ۴۵-۴ با کاربر جدید وارد SQL شوید.
شکل ۴۵-۴ ورود به SQL
بعد از ورود دستور زیر را در New Query اجرا کنید:
OPEN SYMMETRIC KEY SymKey_test
DECRYPTION BY CERTIFICATE Certificate_test;
SELECT CustID, CustName,BankACCNumber_encrypt AS 'Encrypted data',
CONVERT(varchar, DecryptByKey(BankACCNumber_encrypt)) AS 'Decrypted Bank account number'
FROM CustomerData.dbo.CustomerInfoFROM CustomerData.dbo.CustomerInfo;
با اجرای دستور بالا با خطای شکل ۴۶-۴ مواجه خواهید شد که اشاره به دسترسی نداشتن کاربر مورد نظر دارد.
شکل ۴۶-۴ تست دسترسی کاربر
برای حل این مشکل باید به کاربر مورد نظر دسترسی لازم را بدهیم تا بتواند هم به کلید متقارن و هم به گواهینامه مورد نظر دسترسی داشته باشد.
GRANT VIEW DEFINITION ON SYMMETRIC KEY::SymKey_test TO "DEC-USER";
GO
GRANT VIEW DEFINITION ON Certificate::[Certificate_test] TO "DEC-USER";
GO
GRANT CONTROL ON Certificate::[Certificate_test] TO "DEC-USER";
نتیجهی دستورات را در شکل ۴۷-۴ مشاهده میکنید.
شکل ۴۷-۴ افزایش دسترسی کاربر
بعد از دادن دسترسیهای لازم دوباره دستورات بالا را در این قسمت وارد و اجرا میکنیم:
OPEN SYMMETRIC KEY SymKey_test
DECRYPTION BY CERTIFICATE Certificate_test;
SELECT CustID, CustName,BankACCNumber_encrypt AS 'Encrypted data',
CONVERT(varchar, DecryptByKey(BankACCNumber_encrypt)) AS 'Decrypted Bank account number'
FROM CustomerData.dbo.CustomerInfo;
همانطور که در شکل ۴۸-۴ مشاهده میکنید دستور مورد نظر با موفقیت اجرا شده و خروجی به نمایش گذاشته شده است.
شکل ۴۸-۴ تست دسترسی کاربر