بررسی اصول امنیتی پایگاه های داده بخش هفدهم
3-10-3 رمزنگاری کلید نامتقارن
در رمزنگاری به شیوه کلید نامتقارن از دو کلید استفاده میشود : اولی یک کلید خصوصی است که بصورت محلی ذخیره شده و نباید فاش شود و دومی یک کلید عمومیاست که در اختیار همگان قرار دارد. داده رمزنگاری شده توسط کلید عمومیفقط توسط کلید عمومی متناظر با خود قابل رویت است و برعکس. به عنوان مثال فرض کنید برای ارسال نامههای فوقِ سری به یک شخص بسیار مهم ، به هر فرد موجود در جامعه یک صندوق به همراه یک قفل داده شده است. تمامی این قفلها یکسانند(کلید عمومی). افراد پس از قرار دادن نامهها در صندوق ، آنها را به شخص مهم تحویل میدهند. کلید این قفلهای یکسان تنها در اختیار این شخص قرار دارد و تنها اوست که میتواند نامهها را مشاهده کند(کلید خصوصی).
در این روش به دلیل اینکه کلید خصوصی نباید در شبکه منتقل شود ، مشکلات روش کلید متقارن پیش نمیآید.
به دلیل اینکه کلید عمومیدر اختیار همه است ، هویت افرادی که دادهها را رمزنگاری کرده اند قابل تشخیص نیست. برای ایجاد یک ارتباط مطمئن از دو دسته کلید استفاده میشود :پیغام را با کلید خصوصی خودمان-که مشخص کننده هویت ما است- رمزنگاری میکنیم. سپس پیغام رمزی را با استفاده از کلید عمومیدریافت کننده پیغام ، دوباره رمزنگاری میکنیم. دریافت کننده میتواند با استفاده از کلید خصوصی خود و کلید عمومی ما پیغام را رمزگشایی کند.
با استفاده از این شیوه امنیت به بالاترین حد خود میرسد ولی متاسفانه از لحاظ قدرت اجرا بسیار ضعیف است. پس هنگامی که با مقادیر عظیمی از دادهها سرو کار داریم این شیوه ناکارامد است.
با استفاده از دستور CREATE SYMMETRIC KEY میتوان یک کلید ناتقارن ساخت که این کار خود به دو صورت انجام میپذیرد :
ایجاد کلید نامتقارن با استفاده از الگوریتم :
عبارت ENCRYPTION BY PASSWORD مشخص کننده کلمه رمزی است که با آن کلید خصوصی رمزنگاری شده است. الگوریتمهای قابل استفاده در این روش RSA_512 ، RSA_1024 و RSA_2048 میباشند.
CREATE ASYMMETRIC KEY key1
WITH ALGORITHM = RSA_512
ENCRYPTION BY PASSWORD = 'pass'
ایجاد کلید متقارن با استفاده از فایل : میتوان با استفاده از یک فایل که با استفاده از دستور sn.exe ایجاد میشود استفاده کرد.
CREATE ASYMMETRIC KEY key1
FROM FILE = 'C:\Apress\SqlServer2005\SecurityChapter\Encryption\keyfile.key'
ENCRYPTION BY PASSWORD = 'pass'
هر دو تابع EncryptByAsymKey() و DecryptByAsymKey() ، GUID کلید و عبارت رمزنگاری/رمزگشایی شده و کلمه عبور استفاده شده برای رمزنگاری-در صورت وجود- را به عنوان پارامتر میپذیرند. لازم به ذکر است نوع آخرین پارامتر بهتر است بجای varchar ، nvarchar باشد. GUID با استفاده از تابع AsymKey_ID() در دسترس قرار میگیرد. بر خلاف روش کلید متقارن در این روش نیازی به باز کردن کلید نیست.
UPDATE tblStudent
SET sname = EncryptByAsymKey(AsymKey_ID('key1'),sname)
SELECT sname,CONVERT(varchar(max),
DecryptByAsymKey(AsymKey_Id('key1'), sname , N'pass'))
AS DecryptedData
FROM tblStudent
از آنجا که طول دادههای رمزنگاری شده داز است بهتر است نوع ستونی که دادهها در آن قرار میگیرد از نوع varchar(max) تعریف شود.
3-10-4 رمزنگاری با استفاده از گواهینامه
گواهینامه ، یک عبارت امضای دیجیتالی است که برای تعیین هویت استفاده میشود و بهترین روش شناخته شده برای ایمن ساختن وبسایتها-با استفاده SSL - بشمار میرود. این روش مقدار کلید عمومی را به هویت شخص ، سازمان و یا سرویسی که کلید خصوصی متناظرش را در اختیار دارد نسبت میدهد. به عنوان مثال شرکت Microsoft پس از پایان دورههای آموزشی مدرک الکترونیکی در اختیار افرادی که در این دورهها شرکت کرده اند قرار میدهد. برای جلوگیری از جعل مدارک این شرکت از یک امضای دیجیتالی استفاده میکند. این امضا با کلید خصوصی شرکت قفل شده و با استفاده از کلید عمومیکه در اختیار همگان است باز شده و امضا نمایان میشود. حال اگر فردی ادعا کند که چنین مدرکی دارد با استفاده از کلید عمومی میتوان صحت و سقم این مدرک را بررسی کرد. گواهینامهها توسط شرکتهای نظیر VerSign ،Thawte و GlobalSign که به (CAs) معروف هستند منتشر میشوند. موجودیتی که گواهینامه را از CAs دریافت کرده صاحب آن گواهینامه است. گواهینامهها حاوی یک کلید عمومی به همراه دادههای اضافه نظیر اطلاعاتی در مورد مالک کلید و تاریح تولید و انقضا هستند.
برای رمزنگاری بااین روش ابتدا یک گواهینامه با استفاده ار دستور Create Certificate میساریم. عبارت ENCRYPTION BY PASSWORD ، کلمه رمزی را که کلید خصوصی گواهینامه را رمزنگاری کرده است مشخص میکند. عبارت SRART_DATE نشان دهنده تاریخ شروع اعتبار گواهینامه است. اگر این تاریخ مشخص نشده باشد ، این تاریخ برابر با تاریخ جاری است. عبارت EXPIRY_DATE تاریخ پایان اعتبار است و تاریخ پیش فرض برای پایان اعتبار گواهینامه یک سال پس از ایجاد آن است.
CREATE CERTIFICATE MyCertificateName
ENCRYPTION BY PASSWORD = 'MyPassword'
WITH START_DATE = '07/07/2007',
EXPIRY_DATE = '08/07/2007',
SUBJECT = 'identifier'
پس از ایجاد گواهینامه ، میتوان از آن برای رمزنگاری دادهها استفاده کرد که این عمل با استفاده از تابع EncryptByCert() انجام میشود. پارامترهای این تابع GUID گواهینامه –که با استفاده از تابع Cert_ID() بدست میآید- و عبارت (ویا ستون) که قرار است رمزنگاری شود میباشند.
UPDATE tblStudent
SET sname = EncryptByCert(Cert_ID('MyCertidicateName'),sname)
با استفاده از تابع DecryptByCert() میتوان عبارت و یا ستون رمزنگاری شده را رمزگشایی کرد. پارامترهای این تابع GUID ، عبارت و یا ستون رمزنگاری شده و کلمه رمزی که با آن کلید خصوصی گواهینامه رمز شده است.
SELECT sname,CONVERT(varchar(max),
DecryptByCert(Cert_ID('MyCertidicateName'),sname, N'MyPassword'))
AS DecryptedData
FROM tblStudent