مقدمه

گاهی در پروژه‌ای لازم است که داده‌های حساس آن را پنهان کنیم. در اصل ممکن است مشتری از ما بخواهد تا داده‌های حساس رمزنگاری شوند. به این شکل، درصورت دسترسی مستقیم هکر یا کارمند یا حتی مدیر پایگاه داده (DBA) به داده‌ها، آن‌ها نمی‌توانند آن را بخوانند. بعضی از موارد مهم که نیاز به این کار یعنی رمزنگاری دارند مثل شماره کارت اعتباری مشتری، اطلاعات حساب بانکی، سوابق پزشکی و… هستند.
SQL Server به DBA ها و توسعه‌دهندگان داده این امکان را می‌دهد تا داده‌ها را رمزنگاری و در سطح ستون ذخیره کنند. وقتی که یک ستون رمزنگاری می‌شود دیگر برای انسان قابل خواندن نیست.
در این مقاله باهم می‌بینیم که چه‌طور می‌توان رمزنگاری و رمزگشایی در SQL Server را انجام داد.

مراحل رمزنگاری در SQL Server (در سطح ستون)

برای اجرای مجموعه‌ای از دستورات و پرس و جوها باید یک رویه ذخیره شده (Stored Procedure) بنویسید. اگرچه این روش کاملا بدون خطا برای رمزنگاری و رمزگشایی در سطح پایگاه داده نیست، اما موقع کار بر روی این روش، بعضی از تکنیک‌ها و ویژگی‌های خوب SQL Server را یاد می‌گیریم

فاکتورهای اصلی رمزنگاری داده در سطح ستون

سه فاکتور اصلی برای رمزنگاری داده‌ها در سطح ستون وجود دارد:

  •  Master Key کلیدی که برای محافظت از کلیدهای گواهینامه‌ها (Certificate) و کلیدهای متقارن در پایگاه داده استفاده می‌شود.
  • Certificates گواهینامه‌ها که برای رمزنگاری داده‌ها در پایگاه داده استفاده می‌شوند.
  •  Symmetric Key کلید متقارن، با استفاده از موارد زیادی مثل گواهینامه و رمز عبور، رمزنگاری می‌شود.

الگوریتم‌های مختلفی هم برای رمزنگاری کلید وجود دارد. الگوریتم‌های پشتیبانی عبارتند از:

  •  DES
  •  TRIPLE
  •  DES
  •  RC2
  •  RC4
  •  128
  •  AES
  •  128
  •  AES
  •  192
  •  AES
  •  256
  • DES

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

قدم اول

اول به کمک اسکریپت زیر یک Master Key ایجاد کنید:

	Use TestingDB; //This is the Test Database created.
	Create master key encryption by password = ‘abc123’

قدم دوم

بعد از ایجاد Master Key، حالا زمان ایجاد یک گواهینامه (Certificate) شده است:

	Create certificate C1 with subject = ‘Created Card Data’

قدم سوم

حالا با کمک گواهینامه و کلید اصلی SYMMETRIC KEY را ایجاد کنید.
کلید متقارن SK1 با الگوریتم = رمزنگاری AES_256 توسط گواهی C1، را ایجاد کنید.
بعد از ایجاد همه این کلیدها در پایگاه داده، می‌توانیم از آن‌ها برای رمزنگاری و رمزگشایی در SQL Server استفاده کنیم.
در ادامه موارد رمزنگاری داده‌ها در ستون آمده است. حالا یک جدول به نام TestEncryption با 3 ستون با نوع داده خودش مثل نمونه زیر ایجاد می‌کنیم. دقت کنید که ستونی که می‌خواهیم داده‌های رمزنگاری شده را در آن وارد کنیم یا به‌روز کنیم باید VARBINARY به‌عنوان نوع داده باشد.

 

	Id – INT
EncryptedCCNumber – varbinary (256)
CCNumber – Numeric (18,0)

بیایید داده‌ها را در ستون جدول وارد کنیم،
کلید متقارن SK1 را باز کنید
رمزگشایی با گواهی C1

 

  Insert into TestEncryption (Id, EncryptedCCNumber, CCNuber) values (1, ENCRYPTBYKEY (Key_guid (‘SK1’), ‘5000’), ‘5000’)

کلید متقارن SK1 را ببندید.
حالا وقت این است که بررسی کنید آیا داده‌ها رمزنگاری شده‌اند یا خیر، بنابراین موقع اجرای یک پرس و جوی ساده، داده‌ها را از جدول به همان صورت که هست دریافت می‌کنید.

01.	Select * from TestEncryption

رمزگشایی داده در SQL Server

اگر می‌خواهید داده‌ها را رمزگشایی کنید می‌توانید از دستور زیر استفاده کنید:
کلید متقارن SK1 را باز کنید.
رمزگشایی توسط گواهی C1

	Select *, convert (varchar, DECRYPTBYKEY (EncryptedCCNumber)) as ‘Decrypted CC Number’ from TestEncryption

کلید متقارن SK1 را ببندید.
یک ستون اضافی به نام Decrypted CC Number دریافت خواهید کرد. به این ترتیب می‌توانیم داده‌های رمزنگاری شده را در جدول موجود در SQL Server وارد یا به‌روز کنیم.

کدگذاری مبارک!!

انواع پشتیبانی رمزنگاری در SQL Server

حالا که رمزنگاری و رمزگشایی داده در SQL Server را یاد گرفتید، بهتر است بدانید کهMicrosoft SQL Server از انواع رمزنگاری مختلفی برای محافظت از داده‌ها استفاده می‌کند که در ادامه به بررسی آن‌ها می‌پردازیم:

رمزنگاری SSL (Secure Socket Layer)

مثل وب‌سایت‌هایی که ترافیک بین مرورگر و سرور را ایمن می‌کنند، می‌توان SQL Server را طوری تنظیم کرد که از Secure Sockets Layer (SSL) برای رمزنگاری ترافیک هنگام عبور از بین سرور و برنامه سرویس گیرنده استفاده کند. علاوه بر این، مشتری می‌تواند با استفاده از گواهی سرور، هویت سرور را تایید کند. SSL فقط هنگام عبور از شبکه از داده‌ها محافظت می‌کند، اما برخلاف بسیاری از اشکال دیگر رمزنگاری، SQL Server SSL در همه ورژن‌های پشتیبانی شده SQL Server و در تمامی نسخه‌ها در دسترس است.

رمزنگاری TDE (Transparent Data Encryption)

TDE در SQL Server با رمزنگاری داده‌های پایگاه داده و فایل‌های لاگ (Log Files) روی دیسک، از داده‌های موجود محافظت می‌کند. TDE از رمزنگاری در زمان واقعی استفاده می‌کند. رمزنگاری بدون افزایش اندازه داده‌ها و فایل‌های لاگ انجام می‌شود و هنگام خواندن در حافظه نیز رمزگشایی می‌شوند.
رمزنگاری TDE دارای ساختار سلسله مراتبی است و برای رمزنگاری کلید اصلی سرویس (SMK) استفاده می‌شود. شما می‌توانید از SMK برای رمزنگاری اطلاعات کاربری، پسوردهای سرور لینک شده و کلیدهای اصلی پایگاه داده (DMKs) مستقر در پایگاه‌های مختلف استفاده کنید. SQL DMK یک کلید متقارن است که از کلیدهای خصوصی گواهینامه‌ها و کلیدهای نامتقارن ذخیره شده در پایگاه‌ها محافظت می‌کند.
اگر تصمیم به فعال کردن TDE دارید، باید از گواهی و کلید خصوصی مرتبط با گواهی، پشتیبان تهیه کنید. شما باید پایگاه داده را در SQL Server دیگری بازیابی یا ضمیمه کنید.
TDE همچنین به یک کلید رمزنگاری پایگاه داده (DEK) نیاز دارد، که یا یک کلید متقارن است که با استفاده از یک گواهی ذخیره شده در پایگاه داده اصلی محافظت می‌شود، یا یک کلید نامتقارن است که توسط یک سرویس با استفاده از مدیریت کلید توسعه‌پذیر (EKM) محافظت می‌شود. فایل‌های پشتیبان از پایگاه‌های داده فعال شده با TDE با استفاده از DEK رمزنگاری می‌شوند، بنابراین در حین عملیات بازیابی، گواهی محافظت از DEK باید در دسترس باشد.
کلیدهای متقارن از رمزعبور مشابه برای رمزنگاری و رمزگشایی داده‌ها استفاده می‌کنند. کلیدهای نامتقارن از یک رمز عبور برای رمزنگاری داده‌ها (کلید عمومی) و رمز عبور دیگری برای رمزگشایی داده‌ها (کلید خصوصی) استفاده می‌کنند.
برای ایجاد گواهی‌نامه‌ها می‌توانید از دستور CREAT CERTIFICATE و از دستوراتCREATE SYMMETRIC KEY و CREAT ASYMMETRIC KEY نیز برای ایجاد کلیدهای رمزنگاری پایگاه داده استفاده کنید.

رمزنگاری پشتیبان (Backup Encryption)

رمزنگاری پشتیبان مانند TDE عمل می‌کند اما پشتیبان‌های SQL را به‌جای داده‌های فعال و فایل‌های لاگ رمزنگاری می‌کند. رمزنگاری پشتیبان در SQL Server 2014 به بعد قابل دسترسی است. شما می‌توانید رمزنگاری AES 128، AES 192، AES 256 یا Triple DES را مشخص کرده و از کلید گواهی یا کلید نامتقارن ذخیره شده در EKM استفاده کنید. علاوه بر این امکان فعال کردن رمزنگاری پشتیبان و TDE باهم وجود دارد، که در این صورت باید از گواهی‌نامه‌ها یا کلیدهای مختلف استفاده کنید.
درست مانند TDE، اگر Backup Encryption را فعال کنید، باید از گواهی یا کلید نیز نسخه پشتیبان تهیه کنید. بدون کلید یا گواهی، نمی‌توان از پرونده پشتیبان برای بازیابی داده‌ها استفاده کرد. توجه کنید که اگر از رمزنگاری پشتیبان استفاده می‌کنید، هنگام بازیابی داده‌ها باید گواهی‌نامه اصلی را داشته باشید. این بدان معنی است که گواهی باید مشخصات امنیتی را داشته باشد که هنگام ایجاد نسخه پشتیبان تهیه شده است. تمدید گواهی‌نامه‌ها یا تغییر آن‌ها به هر طریقی می‌تواند باعث تغییر مشخصات شود.

رمزنگاری در سطح ستون / سلول (Column/Cell-Level Encryption)

رمزنگاری در سطح سلول در همه نسخه‌های SQL Server وجود دارد، که می‌تواند در ستون‌هایی که دارای داده‌های حساس هستند فعال شود، درست مثل رمزنگاری‌ای که اول این مقاله باهم انجام دادیم. دقت کنید که با رمزنگاری در سطح پایگاه داده، می‌توان کل پایگاه داده و تمام فایل‌های مربوط به سیستم، جداول و نماها را رمزنگاری و رمزگشایی کرد اما با رمزنگاری در سطح ستون، فقط داده‌های موجود در یک ستون از جدول را می‌توان رمزنگاری یا رمزگشایی کرد. داده‌ها بر روی دیسک رمزنگاری می‌شوند و تا زمانی که از تابع DECRYPTBYKEY برای رمزگشایی استفاده نشود، در حافظه رمزنگاری می‌شوند.

همیشه رمزنگاری شده (Always Encrypted)

Always Encryptedبدون این‌که کلیدهای رمزنگاری پایگاه داده را فاش کند، داده‌های حساس را در برنامه‌های کاربر رمزنگاری می‌کند، و این امر باعث تفکیک بین صاحبان داده و مدیران داده می‌شود. به‌عنوان مثال، با فعال بودن Always Encrypted می‌توانید مطمئن باشید که مدیران پایگاه داده شما قادر به خواندن اطلاعات حساس نیستند.
Always Encrypted می‌تواند برای ستون‌های پایگاه داده جداگانه پیکربندی شود. در این‌جا از دو نوع کلید استفاده می‌شود: کلیدهای رمزنگاری ستون و کلیدهای اصلی ستون. کلیدهای رمزنگاری ستون از داده‌ها در یک ستون محافظت می‌کنند و کلیدهای اصلی ستون درواقع “کلیدهای محافظ کلید” هستند که یک یا چند کلید رمزنگاری ستون را رمزنگاری می‌کنند.
فرایند رمزنگاری برای برنامه‌های کاربر شفاف است اما به یک درایور ویژه در رایانه‌های کاربران نیاز دارد. Always Encrypted در SQL Server 2016 به بعد در دسترس است، اما فقط در نسخه‌های Enterprise وجود دارد.

نتیجه گیری

SQL Server ویژگی خوبی برای جلوگیری از دسترسی غیرمجاز و حملات هکرها با استفاده از رمزنگاری داده‌ها فراهم کرده است. هنگام ذخیره‌سازی داده در پایگاه داده و انتقال بین کلاینت و سرور از طریق شبکه، رمزنگاری داده‌های مهم SQL Server، انتقالات و روش‌های ذخیره‌سازی ضروری است. Microsoft SQL Server انواع روش‌های رمزنگاری مختلف را برای محافظت از داده‌ها پشتیبانی می‌کند، تا از داده‌های حساس شما و مشتریان شما به‌خوبی محافظت شود.