رمزگذاری همیشه برای من جذاب بوده است، اما به نظر میرسد که راهاندازی آن میتواند فرآیند بسیار پیچیدهای باشد. با این حال، SQL Server با معرفی Always Encrypted (AE) به SQL Server 2016 و Azure SQL Database کار را بسیار ساده کرد. برخلاف رمزگذاری داده های شفاف (TDE) که فقط فایلهای داده و پشتیبانگیری را در حالت استراحت رمزگذاری میکند، AE در سطح ستون پیکربندی میشود و نه در سطح پایگاه داده. علاوه بر این، Always Encrypted در نسخه استاندارد (و Express) موجود است که با SQL Server 2016 SP1 شروع می شود. شما به راحتی می توانید شماره امنیت اجتماعی (SSN) را که در ایالات متحده بسیار حساس به حساب می آید یا ستون حقوق و دستمزد را در جدولی تنها با چند کلیک رمزگذاری کنید. در نسخههای قبلی SQL Server، میتوانستید از رمزگذاری در سطح سلول (CLE) برای انجام این کار استفاده کنید، اما نیاز به تغییر کد داشت و کلیدها در پایگاه داده ذخیره میشد و دادهها بدون رمز به برنامه ارسال میشد. که ما را به مزیت دیگر AE می رساند، این است که DBAها دیگر نمی توانند مقادیر رمزگذاری نشده داده ها را ببینند، همانطور که با CLE می توانستند، زیرا کلید رمزگذاری ستون در خارج از SQL Server ذخیره می شود.
بیایید ببینیم چگونه این کار را انجام میدهید و معنی هر یک از این گزینهها را بررسی کنیم.
با استفاده از Adventure Work 2016 CTP3 HumanResources.Employee Table می خواهیم ستون Birthdate را رمزگذاری کنیم.
با کلیک راست روی جدول > رمزگذاری ستون ها را انتخاب کنید
این یک Wizard را نشان می دهد، یکی از دو روش توصیه شده برای پیکربندی AE. گزینه دیگر استفاده از PowerShell است.
در صفحه Intro روی Next کلیک کنید
در مثال زیر متوجه خواهید شد که ستون ها را لیست می کند و سپس STATE رمزگذاری را نشان می دهد که نشان می دهد آیا ستون واجد شرایط رمزگذاری است یا خیر. چندین ویژگی ستون پشتیبانی نشده وجود دارد که ممکن است باعث شود یک ستون رمزگذاری نشود. این پیوند به MSDN این موضوع را با جزئیات بیشتر توضیح می دهد. موارد موجود در این لیست پشتیبانی نمیشوند زیرا دارای یک محدودیت پیشفرض یا یک محدودیت چک تعریف شدهاند:
- ALTER TABLE [HumanResources].[Employee] ADD CONSTRAINT [DF_Employee_VacationHours] DEFAULT ((0)) FOR [VacationHours] ALTER TABLE [HumanResources].[Employee] WITH CHECK ADD CONSTRAINT [CK_Employee_BirthDate] CHECK (([BirthDate]>='1930-01-01' AND [BirthDate]<=dateadd(year,(-18),getdate()))) GO
این تنها نمونه ای از یکی از بلوک های جاده ای است که ممکن است با آن روبرو شوید. بنابراین، بیایید یک قدم به عقب برگردیم و مثالی را تنظیم کنیم که بتوانیم به راحتی از آن استفاده کنیم.
راه اندازی
برای ایجاد یک کپی از جدول Employee دستور زیر را اجرا کنید. ما این کار را انجام می دهیم تا یک جدول بدون هیچ محدودیتی بسازیم.
- SELECT * INTO [HumanResources].[Employee_AE] FROM [HumanResources].[Employee]
حالا دوباره روی Table کلیک راست کنید > Encrypt Columns را انتخاب کنید
در این مورد، ستون مورد نظر ما BirthDate است، بنابراین من یک چک در کنار آن قرار می دهم. برای ادامه، باید نوع رمزگذاری را انتخاب کنم.
دو احتمال قطعی و تصادفی وجود دارد.