درس هفدهم – رمزگذاری بر روی دیتابیس

یکی از مهم‌ترین کارها در 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;

همان‌طور که در شکل ۴۸-۴ مشاهده می‌کنید دستور مورد نظر با موفقیت اجرا شده و خروجی به نمایش گذاشته شده است.

شکل ۴۸-۴  تست دسترسی کاربر

کتاب‌های جدید

کتاب آموزشی CCNP ENARSI 300-410
زبان فارسی
۱۲۲۲ صفحه
نسخه PDF

کتاب آموزشی CCNA 200-301
زبان فارسی
۷۱۵ صفحه
نسخه PDF

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Scroll to Top