یکی از قویترین ابزارهای مدیریت بانکهای اطلاعاتی [1] ، محصول شرکت Microsoft به نام Microsoft SQL Server® است. درسال 1995 شرکت Microsoft امتیاز تولید مشترک پروژهی SQL Server را از Sybase®خرید و محصول خود را با نام Microsoft SQL Server به بازار معرفی کرد.
اولین نسخه از سری MSSQL Server با نگارش 6 به بازار آمد و این درحالی بود که حتا تا چند سال پس از آن، هرگاه صحبت از محلی برای نگهداری اطلاعات به میان میآمد، همهی نگاهها به Oracle®معطوف میشد. تا اینکه Microsoft نگارش 7 از سری MSSQL Server را پس از یک مهندسی مجدد در ساختار این برنامه ارایه کرد. با ارائهی این نگارش Microsoft فصل نوینی را در زمینهی تولید سیستمهای مدیریت بانک اطلاعاتی آغاز کرد و توانست اکثریت این بازار را تحت پوشش خود قرار دهد. تا جاییکه در پایان سال 200 بیش از60% تمام بانکهای اطلاعاتی وب و 70% از تمام بانکهای اطلاعاتی تحت سیستم عامل Windows® ، MS SQL بوده اند.
امنیت ، بهطور یقین یکی از مواردیست که کاربران اینگونه سیستمها به آن بهای زیادی میدهند. در این مقاله به دور از اظهار نظر درمورد قدرت یا ضعف برنامهی MSSQL Server در این زمینه، قصد بررسی وضعیت نگهداری کلمات عبور کاربران در آن را داریم.
چگونه MSSQLServer® کلمات عبور را نگهداری میکند؟
SQL Serverاز یک تابع مستند نشده – ()PWDencrypt - برای مخلوط کردن [2] کلمات عبور کاربران، که در جدول SysxLogins در بانک اطلاعاتی Master نگهداری میشود، استفاده میکند. جزییات تابع PWDencrypt()تاکنون منتشر نشده است.
مخلوط کلمهی عبور در MSSQL Server شبیه چیست؟
دستورات زیر را در Query Analyzer یا هر برنامهی دلخواه خود تایپ کنید:
Select Password from Master.dbo.sysxlogins where name = 'sa'
چیزی شبیه به این را خواهید یافت:
0x0100DF4C0B1E72BB7F9B3DB61DA3648B716FA8956FB20D12 6A751CABC25790961AB6EF9E86D59CFC0D5108272FFF
این مخلوط کلمهی عبور برای کاربر ‘SA' در دستگاه من است.
چه میتوانیم از PWDencrypt() بیرون بکشیم؟
دستور زیر را وارد کنید:
Select PWDencrypt('abc')
نتیجه:
0x0100EC02A44A2181C888A7B431778FBF2E4C1A620ABDEAAD 3A6698979F269A93E2871DDC0A65DC48015C9E5B1A55
چند ثانیهی بعد مجدداً آن را اجرا کنید:
0x0100D003A945B84B42D6CB19060453CD906BE04BC9610BB0 F54D40227748F3CE571C5762BBA61A9E7F03267071B3
دو مخلوط متفاوتند درحالی که ورودی ما( ‘abc' ) ثابت بود. پس زمان نقش مهمی را در روند تهیه و نگهداری مخلوطها بازی میکند. دلیل آن هم این است که اگر دو نفر از یک کلمهی عبور استفاده کنند، مخلوط کلمات عبورشان متفاوت خواهد بود و درنتیجه یکسان بودن آنها را نمیتوان فهمید.
بزرگی و کوچکی حروف
دستور زیر را اجرا کنید:
Select PWDencrypt('AABBCCDD')
تنیجه:
0x01001F09D27F363FD03442CFC83D00BFFC185D656591541B 006D363FD03442CFC83D00BFFC185D656591541B006D
با کمی جابجایی داریم:
0x0100
1F09D27F
363FD03442CFC83D00BFFC185D656591541B006D
363FD03442CFC83D00BFFC185D656591541B006D
همانطور که میبینید، 40نویسهی [3] آخر با 40تای یکی مانده به آخر برابر است. با چند آزمایش نظیر میتوان دریافت که کلمات عبور درواقع 2بار نگهداری میشوند. یکبار بهحالت عادی و یکبار هم به صورت حروف بزرگ. حال اگر برنامهای بخواهد از روش سعی و خطا برای به دست آوردن کلمات عبور استفاده کند، میتواند به جای امتحان کردن تمام حروف، یکبار به صورت کوچک و یکبار به صورت بزرگ، تنها حالت بزرگ را امتحان کند و این تعداد حروف را کمتر و کار را راحتتر میکند.
نقش زمان
دریافتیم که تغییر زمان باعث تغییر مخلوط میشود. نیز میدانیم که باید دادهای از آن زمان همواره در دست باشد تا وقتی کاربری اقدام به ورود به MSSQL Server میکند، بتوان کلمهی وارد شده توسط او را با کلمهی عبور مخلوط شده مقایسه کرد. آن داده بخش اول از مخلوط است (هشت نویسهی قبل از دو دستهی 40تایی). درمثال بالا داشتیم:
0x0100
1F09D27F
363FD03442CFC83D00BFFC185D656591541B006D
363FD03442CFC83D00BFFC185D656591541B006D
اطلاعات مورد نظر ما 1F09D27F است و اتفاقی که میافتد از این قرار است:
ابتدا تابع Time() –در زبان C - فراخوانده شده و نتیجهی آن به عنوان ورودی تابع SRand() استفاده میگردد. حاصل این تابع یک نقطهی آغاز برای تهیهی اعدادی دروغین خواهد بود. حال تابع Rand() فراخوانی میشود. عدد برگردانده شده به صورت رشته(نه عدد) نگهداری میشود. این عدد را i1 درنظر بگیرید. یکبار دیگر تابع Rand() فراخوانی شده عدد کاذب دیگری برایمان فراهم میکند. این عدد را نیز i2 مینامیم. حال اعداد i1 و i2 کنارهم قرار میگیرند( :i1:i1 ) و یک عدد واقعی را میسازند. به صورتی که i1 بخش پرارزش و i2 بخش کم ارزش آن عدد است.
مخلوط کلمهی عبور
کلمهی عبور کاربران به فرم UNICODE تبدیل میشود- اگر نبود- سپس عدد ساخته شده در بخش قبل به انتهای آن اضافه میشود و حاصل به تابع Crypt در Advapi32.dll ارسال میشود تا بهکمک الگوریتم "مخلوط سازی امن [4] " یا SHA یک مخلوط از آن ساخته شود. سپس کلمهی عبور به حالت بزرگ تبدیل میشود، یکبار دیگر عدد ساخته شده به انتهای آن اضافه میشود و یک مخلوط دیگر به دست میآید:
0x0100 یک مقدار ثابت
1F09D27F Rand () عدد ساخته شده توسط
363FD03442CFC83D00BFFC185D656591541B006D مخلوط کلمهی عبور
363FD03442CFC83D00BFFC185D656591541B006D مخلوط حالت بزرگ کلمهی عبور
روند تصدیق کلمهی عبور کاربران.
هنگامی که یک کاربر سعی در وارد شدن به MSSQLServer دارد، ابتدا SQL Server بخش مربوط به زمان (و مربوط به این کاربر) را از داخل جدول Master.dbo.sysxlogins خارج میکند. سپس آن را یکبار به انتهای کلمهی عبور وارد شدهی کاربر و بار دیگر به انتهار کلمهی عبور وارد شده باحروف بزرگ میچسباند و با الگوریتم گفته شده یک مخلوط ساخته میشود. اگر این مخلوط با مخلوط موجود در جدول یکسان بود، کاربر میتواند وارد شود. درغیر این صورت کلمهی عبور او اشتباه است
نویسنده آزاد کمالی روستا