Skip to main content

رمزنگاری داده ها

Encrypting data

در این درس جامع، فرآیند رمزنگاری داده‌ها در SQL Server با استفاده از افزودن یک ستون جدید به جدول (با دستور ALTER TABLE و تعریف varbinary)، به‌روزرسانی داده‌های حساس با تابع ENCRYPTBYPASSPHRASE و نمایش نتایج رمزگشایی شده با استفاده از ترکیب DecryptByPassPhrase و CONVERT (به NVARCHAR) به تفصیل توضیح داده شده است. همچنین، چالش‌های مربوط به استفاده از پسورد نادرست و اهمیت تطابق آن برای موفقیت عملیات رمزنگاری/رمزگشایی مورد بررسی قرار گرفته و روش‌های جایگزین رمزگذاری در SQL Server 2016 با certificate یا کلیدهای خاص نیز معرفی شده‌اند. این آموزش تخصصی برای متخصصان بازار کار طراحی شده و هدف آن ارائه دیدگاهی عملی و کاربردی در زمینه حفاظت از داده‌های حساس است، که در ویدیوی آموزشی منتشر شده در یوتیوب به‌طور کامل به نمایش گذاشته خواهد شد.

لینک کمکی (official link) – رمزنگاری داده‌ها در SQL Server: آموزش ENCRYPTBYPASSPHRASE و DecryptByPassPhrase

در این ویدئوی آموزشی؛ من میخوام راجب به جنبه دیگه ای از امنیت که همون رمزگذاری داده ها هست و به اصطلاح بهش Encrypting data میگن، صحبت کنم، من میخوام ببینم که چطور داده ها رو در پایگاه داده رمزگذاری میکنن؟

اگه پایگاه داده AdventureWords2014 رو باز کنم و بعد از اون tables رو باز کنم و کمی به سمت پایین اسکرل کنم، یک جدولی با نام  Sales.CreditCardمیبینم.

روی اون راست کلیک میکنم و Select Top 1000 Rows رو انتخاب میکنم و درست این پایین در قسمت تنظیمات Results یکسری مجموعه نتایج برای شماره کارتهای اعتباری یا همون credit card رو میبینم که می بینید اونها قابل مشاهده هستند.

و این بهترین عملکرد نیست چون شماره کارت های اعتباری می تونه یکمی محرمانه محسوب بشه و می بینید که رمز نگاری نشدن. ما نمیخوایم این داده ها به صورت رمزگذاری نشده ذخیره بشن.

در ابتدا کاری که ما میخوایم انجام بدیم این هست که با اضافه کردن یک ستون به جدول، اون رو تغییر بدیم، و میخایم از این ستون برای ذخیره کردن داده رمزگذاری شده استفاده کنیم.

برای این منظور از دستور ALTER TABLE استفاده میکنیم و بعد از اون باید نام جدولی که میخوایم تغییر بدیم رو قرار میدیم.

در این مورد، نام جدول  Sales.CreditCardهست و چون من میخوام اسم یک ستون رو اضافه کنم از بند ADD استفاده میکنم.

من میخوام نام این ستون رو CardNumber_Encrypted بگذارم. نوع داده برای ستون رمزگذاری شده همیشه  var binaryهست، دقت کنید var از variable گرفته شده و در کل var binary به این معنی هست که در حال تعریف کردن یک رشته باینری با طول متغیر هستیم، من طول متغیر رشته ای که میخام کدگذاری ام بصورت باینری یا دودوئی درش صورت بگیره رو 255 میذارم.

باید مطمئن بشید که در پایگاه داده AdventureWords2014 در حال اجرای این دستور هستید، پس از این لیست کشویی بالاتر از پانل object Explorer درست سمت چپ دکمه Execute خیلی راحت میام و نهایتا دیتابیس AdventureWords2014 رو انتخابش می کنم.

من پیش میرم و اون رو با انتخاب گزینه Execute اجرا میکنم، پیغام انجام موفقیت امیز رو با Commands completed successfully در قسمت Messages بهم میده و این خیلی خوبه. حالا، من باید بعضی داده ها رو از اون ستون بگیرم و خوب میدونید که این کار رو خیلی راحت میشه

با اجرای یک دستور UPDATE انجام داد.

بنابراین UPDATE Sales.CreditCard رو مینویسم، ما میخوایم مجموعه مقداری که فراخونی میشه از این ستون CardNumber_Encrypted که چند لحظه پیش با دستور ALTER TABLE تعریفش کردیم تنظیم یا SET بشه، پس اول SET و بعدش هم نام ستون CardNumber_Encrypted رو می نویسیم و من میخوام برای اون یک مقداری قرار بدم که توسط یک تابع تعیین بشه.

پس یک علامت = میذارم و برای مشخص کردن تابع مد نظر ؛این تابع ENCRYPTBYPASSPHRASE نامیده میشه، دقت کنید که این تابع رو می تونیم خیلی راحت از همین لیستی که با نوشتن چند حرف اول ENCRYPTBYPASSPHRASE برامون بنمایش درمیاد، انتخابش کنیم، بد نیست بدونید: ENCRYPTBYPASSPHRASE یک تابعی هست که 2 پارامتر رو میگیره، پس کاری که باید انجام بدیم این هست که این دو پارامتر رو همین جا تعریفش کنیم.

اولین پارامتر کلمه عبور یا همون پسورد هست، من میخوام از یک کلمه عبور ساده مثل خود واژهPASSWORD استفاده کنم.

در زمان استفاده در کارتون، یادتون نره که شما باید از علائم طولانی تر و خیلی پیچیده تر برای عبارت رمزتون استفاده کنین.

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

و برای ما، داده ها در حال حاضر میدونیم که، در ستون CardNumber ذخیره شدن. من اون رو اجرا میکنم و یک پیغام میده که حدود 19000 سطر، تحت تاثیر قرار گرفت. این خوبه. درست به این معنی که اون هر سطر از جدول رو بروزرسانی کرده. که این همون چیزی هست که ما پیش بینی کردیم و انتظارش رو داشتیم. بنابراین در حال حاضر اجازه بدین که به اون داده ها یک نگاهی بندازیم.

برای این کار من میام و دستور SELECT رو وارد می کنم و در ادامه میخوایم که با همین دستور SELECT دو ستون CardNumber و  CardNumber_Encryptedرو در ادامه با دستور from

از جدول Sales.CreditCard انتخاب کنیم.

اگه ما اون رو اجرا کنیم، می بینیم که دو ستون رو به ما برمیگردونه.

اولی شماره CREDIT CARD رمزگذاری نشده هست و اون یکی احتمالا داده های رمز گذاری شده credit card هست. این اطلاعات ستون CardNumber_Encrypted رو، ما واقعا نمیتونیم بخونیم. اونها فقط یکسری حروف نامفهوم به نظر میرسن. این خیلی خوبه! ما داده ها رو به صورت کدگذاری شده در اون ستون داریم. در حال حاضر یک کار بزرگ که رمزگشایی داده هست وجود داره. ما باید بتونیم داده رو به چیزی برگردونیم که قابل خوندن باشه.

بنابراین من، بعد از لیست ستونها درست این بالا در کد مربوط به دستور select یک کاما اضافه میکنم و بعد از اون یک تابعی قرار میدم که داده رو رمزگشایی کنه. این تابع یک نوع داده ناشناخته رو برمیگردونه. بنابراین ما باید اون رو به نوع داده شناخته شده برگردونیم. اینطوری هم میشه گفت که الان من میخام نوع داده unknown data رو به نوع داده known data تبدیل کنم، در این مورد، ما میخوایم اون رو تبدیل به NVARCHAR کنیم. بخاطر اینکه اون همون چیزی هست که، داده ها قبلا بصورت جنرال و اصلیش بودن و وجود داشتن.

بنابراین در ابتدا تابع CONVERT رو فراخونی میکنیم و بعد از اون پرانتز باز میکنیم و اولین پارامتری که در پرانتز قرار میدیم nvarchar 50 است و بعد از اون کاما و بعد از اون هم ما باید تابع رمزگشا رو فراخونی کنیم که  DecryptByPassPhraseهست.

همانطور که برای رمزگذاری، تابع، EncryptByPassPhrase نامیده شد و اینبار می بینیم که تابع برای رمزگشایی DecryptByPassPhrase نامیده میشه.

تعریف کردن پارامترهاش نسبتا اسون هست، و این رو هم بدونید که اون هم دو پارامتر رو میگیره.

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

برای من همونطور که این پایین هم مشاهده می کنید ستون رمز نگاری شده ستون CardNumber_Encrypted هست و من میتونم اون رو اجرا کنم. می بینید که با ارر مواجه شدم، دلیلیش هم مشخص هست؛ مطمئن بشین که دو پرانتز در پایان، برای بسته شدن کد قرار داده بشه چون، قبلا دو پرانتز رو باز کردیم.

و حالا ما میتونیم کدمون رو اجرا کنیم، و ما میبینیم که ستون اول card number هست و اخرین ستون که الان برای رمزگشایی ستون CardNumber_Encrypted تعریفش کردیم، دقیقا شماره های مشابه با همین ستون اول داره. بنابراین، این نشون میده که ما تونستیم داده رو رمزگشایی بکنیم و داده دقیقا همون چیزی شد که قبل از رمزگذاری بود. بنابراین توجه کنین که اگه شما پسورد رو نادرست در این تابع بذارید، نمیتونین داده رو رمزگشایی کنین.

بیاید و یک پسورد اشتباه برای داده ای که میخایم رمزگشایی اش کنیم، قرار بدیم، خب می دونید که من قبلا برای تعریف ستون رمز گذاری شده CardNumber_Encrypted اومدم و از کلمه Password بعنوان یک پسورد برای رمز نگاری ستون card number استفاده کردم؛ حالا بجاش میام و بجای این کلمه میذارم 123Password، می بینید که اینبار نتیجه ای بدست نیومد، درست شد برعکس زمانی که از کلمه Password برای رمزگشایی استفاده کردم و نتایج دقیق هم گرفتم، پس این همون چیزی بود که ما میخواستیم.

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

Sql sever 2016، توابع رمزگذار و رمزگشای دیگه ای داره، اونها همیشه به صورت جفت کار میکنن و اونها از دستگاههای متفاوت برای رمزگذاری، استفاده میکنن. بنابراین برای مثال در اینجا ما، با استفاده از یک رمز عبور، رمزگذاری کردیم و همچنین اون ممکن هست که با استفاده از یک certificate یا یک کلید خاص رمزگذاری بشه و سپس شما اگه کسی باشین که با این متد رمز گذاری روی داده ها رو تعریف کردین میتونین همین کاری که چند لحظه پیش با استفاده از پسورد برای تعریف پارامتر رمزنگاری انجام دادیم رو به طور مشابه برای رمزگشایی استفاده کنین. پس در این حالت شما می تونید رمز گذاری رو با استفاده از certificate و یا با استفاده از کلیدهای خاص تون انجام بدید. ولی بجای استفاده از رمز عبور برای رمزگشایی اینبار باید از certificate با کلید خاص تون استفاده کنید و بدون اونها رمزگشایی مشکل خواهد بود.

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

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

دوره ها
درس ها
Tha PMIS
طهاکو من
0