نگاهي به نحوه‌ي نگه‌داري كلمات عبور در Microsoft SQL Server

Salar

Active Member
يكي از قوي‌ترين ابزارهاي مديريت بانك‌هاي اطلاعاتي [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'

چيزي شبيه به اين را خواهيد يافت:

0x0100DF4C0B1E72BB7F9B3DB61DA3648B716FA8956FB20D126A751CABC25790961AB6EF9E86D59CFC0D5108272FFF

اين مخلوط كلمه‌ي عبور براي كاربر ‘SA' در دستگاه من است.

چه مي‌توانيم از PWDencrypt() بيرون بكشيم؟

دستور زير را وارد كنيد:

Select PWDencrypt('abc')


نتيجه:

0x0100EC02A44A2181C888A7B431778FBF2E4C1A620ABDEAAD3A6698979F269A93E2871DDC0A65DC48015C9E5B1A55

چند ثانيه‌ي بعد مجدداً آن را اجرا كنيد:

0x0100D003A945B84B42D6CB19060453CD906BE04BC9610BB0F54D40227748F3CE571C5762BBA61A9E7F03267071B3

دو مخلوط متفاوتند درحالي كه ورودي ما( ‘abc' ) ثابت بود. پس زمان نقش مهمي را در روند تهيه و نگه‌داري مخلوط‌ها بازي مي‌كند. دليل آن هم اين است كه اگر دو نفر از يك كلمه‌ي عبور استفاده كنند، مخلوط كلمات عبورشان متفاوت خواهد بود و درنتيجه يكسان بودن آن‌ها را نمي‌توان فهميد.

بزرگي و كوچكي حروف

دستور زير را اجرا كنيد:

Select PWDencrypt('AABBCCDD')

تنيجه:

0x01001F09D27F363FD03442CFC83D00BFFC185D656591541B006D363FD03442CFC83D00BFFC185D656591541B006D

با كمي جابجايي داريم:

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 خارج مي‌كند. سپس آن را يك‌بار به انتهاي كلمه‌ي عبور وارد شده‌ي كاربر و بار ديگر به انتهار كلمه‌ي عبور وارد شده باحروف بزرگ مي‌چسباند و با الگوريتم گفته شده يك مخلوط ساخته مي‌شود. اگر اين مخلوط با مخلوط موجود در جدول يكسان بود، كاربر مي‍‌تواند وارد شود. درغير اين صورت كلمه‌ي عبور او اشتباه است.

منابع:

Microsoft SQL Server Passwords (Cracking the password hashes) by David Litchfield 24th June 2002 www.ngssoftware.com

Designing SQL Server 2000 Databases for .Net™ Enterprise Servers by Robert Patton, Jennifer Ogle


--------------------------------------------------------------------------------

[1] RDBMS: Relational Database management System
[2] Hashing
[3] Character
[4] Secure Hashing Algorithms


نويسنده : آزاد كمالي روستا
ناشر : سايت همكاران سيستم
 

جدیدترین ارسال ها

بالا