PDA

View Full Version : مقاله ای جامع در مورد امنیت و الگوریتم های امنیت داده ها.



Behrouz_Rad
شنبه 28 آذر 1383, 15:23 عصر
سلام.
یکی از دوستان در مقاله ای از روش های کدگذاری داده ها پرسیده بودن. همین رو بهانه خوبی دونستم تا آنچه به نظرم در مورد امنیت داده ها مهم هست رو به نظر دوستان برسونم.
امنیت یک بحث کلی داره که نمیشه در چند خط به اون پرداخت.
امنیت به دو سطح تبدیل میشه: (جدا از بحث شبکه)
1) امنیت در سطح برنامه
2) امنیت در سطح داده های برنامه

در مورد امنیت در سطح برنامه، مطالب فراوان هست ولی در یک نظر کلی، منظور از امنیت برنامه، ایجاد روش هایی در پیشگیری از ایجاد دستبرد در برنامه و منابع برنامه مورد نظر، در کوتاه مدت یا بلند مدت است. (Web Application یا Desktop Application).
به عنوان یک مثال برای برنامه های Web Application عرض کنم که میشه تنها با چند خط کدنویسی ساده، با ارسال مقادیر زیاد داده ای از طریق Post به سایت مورد نظر، ترافیک سایت را به طرز بسیار زیادی بالا برده، Transfer سایت را تا حدی که مایلید زیاد کرده و منجر به ترکیدن Band Width (پهنای باند) سایت شوید. (کاری رو که بنده چند وقت پیش با قسمت وبلاگ سایت PersianBlog.Com انجام دادم. البته این سایت از نظر سخت افزاری بسیار قدرتمنده و آسیب چندانی ندید ولی تا 2 هفته مسئولین سایت موفق به برطرف کردن مشکل نشدند. دوستانی که یک ماه پیش به قسمت وبلاگ این سایت سر زده باشند،بیشتر از پنجاه هزار Comment با عنوان vb4u مشاهده کردند که اجازه ارسال نظرات رو به اونها نمی داد چون برای یک Comment باید Comment های قبلی پردازش شوند و از آنجایی که زمان اجرای Script توسط برنامه نویس حداکثر یک دقیقه در نظر گرفته میشه و پردازش پنجاه هزار پیغام بیشتر از یک دقیقه طول میکشه، بنابراین با خطای Script Time Out of Range روبرو خواهید شد)
البته این مشکل در این سایت وجود نداره و برنامه نویس حرفه ای سایت با ایجاد یک Delay در ارسال پست ها (که البته تنها راه هم هست) مشکل رو حل کرده. بنابراین اگر دقت کرده باشید، در زمانی که قصد دارید 2 تا پست رو پشت سر هم و در فواصل زمانی اندک انجام بدید، پیغامی مبنی بر اینکه قادر نخواهید بود پست را بلافاصله بعد از پست بعدی بفرستید و باید مقداری صبر کنید، به شما نمایش داده خواهد شد.
و مثالی هم در مورد برنامه های Desktop Application:
خط زیر را در نظر بگیرید:


If MyTextBox.Text = "123456” Then
MsgBox "OK"
Else
MsgBox "Fail"
End If

مثال بالا یکی از موارد اشتباه فاحشی است که در بسیاری از برنامه ها مشاهده شده و کلمه عبور را به راحتی با یک Hex Editor می توان به دست آورد.

و اما بحث اصلی من در مورد امنیت در سطح داده های برنامه است.
به طور ساده می تونیم بگیم که منظور از امنیت در سطح داده، کدگذاری داده است.
یعنی ابداع یا استفاده از روش هایی که باعث میشه داده های مورد نظر ما به کاراکترهایی تبدیل شوند که تنها برای کسانی که مجاز به استفاده از آنها هستند مفهوم داشته باشند.
در بحث داده ها که عموم بحث بر سر بانک های اطلاعاتی است، دو مورد مورد توجه است:
1) سیستم مدیریت پایگاه داده یا DBMS (DataBase Management System)
2) نحوه ذخیره داده ها در DBMS

انتخاب مورد اول به عهده کاربر است. یعنی با توجه به فاکتور ((اهمیت اطلاعات)) انتخاب می شود.
در ساده ترین و کم اهمیت ترین سطح (در زمانی که امنیت و در درجه دوم، سرعت مهم نباشد) یک فایل متنی ساده، پاسخگوی نیاز ما است.
اکثر کاربران که در سطح آغازین وارد دنیای Database می شوند، کار خو درا با بانک اطلاعاتی نرم افزار Access آغاز می کنند. (که مطمئنا در یک طراحی حرفه ای و آنجا که امنیت مطرح باشد، به هیچ وجه پاسخگوی نیاز ما نیست.)
امروزه بانک اطلاعاتی نرم افزار SQL Server که یک نرم افزار کلاینت-سرور است در بیشتر کاربردها به عنوان یک منبع ذخیره سازی قابل اطمینان که ضریب امنیتی بالغ بر 18 برابر بانک Access دارد، مورد استفاده است. (18 لایه امنیتی)
در سطوح بالاتر نیز، بانک های MySQL و Oracle قرار دارند.

و اما مورد دوم که بحث اصلی ما است.
نحوه ذخیره سازی داده ها به طور پیش فرض به شکل کاراکتری است. حال اگر بتوان یک DBMS قدرتمند را با یک الگوریتم قدرتمند کدکردن داده ها ترکیب کرد، مسلما در سطح امنیت توانسته ایم به جایگاه بالایی دست پیدا کنیم.
نکته مهم: به این نکته مهم توجه داشته باشید که نظم، دشمن امنیت است.
هرچه داده های ما منظم تر باشند، امکان دستبرد به آنها بیشتر است. به همین خاطر است که در امور کوچک (نگهداری اطلاعات سربازان یک پادگان)، فایل Pile بیشترین کاربرد را دارد نه فایل ترتیبی (Sequential) یا شاخص دار (Indexing).

دو الگوریتم محبوب که در کدگذاری داده ها (Encrypt) بیشتر مورد استفاده قرار می گیرند، به شرح زیر هستند:
1) الگوریتم Huffman.
2) الگوریتم Cipher (که ویندوز نیز در کدگذاری داده ها از این الگوریتم استفاده می کند)

الگوریتم Huffman، یک الگوریتم قدیمی است که در ایران برای دانشجوهای کامپیوتر در درس ساختمان داده ها و به عنوان مبحث درخت های ویژه کامپیوتری تدریس می شود.
البته باید مقداری با ساختمان و مبحث درخت ها آشنایی داشته باشید.
فرض کنید رشته زیر برای کدگذاری وجود دارد:


aacccbeeee

قصد داریم رشته فوق را با استفاده از الگوریتم Huffman، کدگذاری کنیم.
ابتدا تعداد تکرار هر یک از کاراکترها را می نویسیم:


a = 2
b = 1
c = 3
e = 4

پس درصد احتمال ظهور هر یک از کاراکترها به شرح زیر شد:
کاراکتر a: 2 به 10
کاراکتر b: 1 به 10
کاراکتر c: 3 به 10
کاراکتر e: 4 به 10

حالا در هر مرتبه هر دو کاراکتری که احتمال ظهورشان از بقیه کمتر است را با هم ترکیب می کنیم:
کاراکتر b با کاراکتر a که می شود 3
کاراکتر c با کاراکتر e که می شود 7
و در نهایت 3 با 7 که می شود 10 و ریشه ی درخت را تشکیل می دهد.
در درختی که ایجاد می کنیم، گره های داخلی بیانگر جمع درصد ظهور کاراکترها و گره های خارجی بیانگر نام کاراکتر است.

البته در اینجا نمیشه شکل درخت را کشید ولی پس از پایان ایجاد درخت، به شاخه های سمت چپ عدد صفر و به شاخه های سمت راست عدد یک نسبت داده می شود و در نتیجه، کد Huffman داده ی مورد نظر به شکل زیر به دست می آید که به صورت صفر و یک است.


a = 01
b = 11
c = 01
d = 00

البته در VB به خاطر ساپورت نکردن از اشاره گرها، پیاده سازی این الگوریتم قدری مشکل است اما غیر ممکن نیست. ولی کد زبان C این الگوریتم را به عنوان پروژه یک درس نوشته ام که اگر دوستان خواستند تبدیل به VB بکنند در اختیارشون خواهم گذاشت.

و اما الگوریتم رمز Cipher که البته این الگوریتم یک مقدار قدیمی هست ولی اینقدر این الگوریتم کارامد هست که ویندوز نیز از این الگوریتم در کدکردن داده ها استفاده می کند.
توجه: می توانید در پوشه نصب ویندوز و در پوشه System32 فایل Cipher.exe را پیدا کنید.
و اما نحوه ی عملکرد الگوریتم Cipher:
کلید این الگوریتم رمز به صورت K=(K1,K2,00000000,Kn) است که در این کلید، حرف N، یک عدد ثابت و مثبت و معرف طول کلید است.
تابع رمز گذار (Encrypt) الگوریتم Cipher به شکل زیر است:


Ek(x1,x2,000000,xn) = (x1+k1,00000+kn) mod 26

و تابع رمزگشای (Decrypt) الگوریتم Cipher نیز به شکل زیر است:


Dk(y1,00000,yn) = (y1-k1,00000,ym-km) mod 26

در تابع رمزگذار، xi، حرف متن اصلی و در تابع رمزگشا، yi، حرف متن رمز شده است.
مثال:
فرض کنید برای کلید رمز، کلمه ی CIPHER را انتخاب کرده ایم. پس در نتیجه، n=6 خواهد شد و معادل کلید رمز، عبارت است از:


k=(2,8,15,7,4,17)

و متنی که می خواهیم به صورت رمز درآید، عبارت زیر است:


"thiscryptosystemis"

برای رمز کردن این متن، آن را به گروه های شش تایی تقسیم می کنیم و کلید را در زیر آنها می نویسیم. یعنی:


t h i s c r y p t o s y s t e m i s
c i p h e r c i p h e r c i p h e r

حالا معادل عددی هر حرف از دو ردیف را می نویسیم. یعنی:


19 7 8 18 2 17 24 15 19 14 18 24 18 19 4 12 8 18
2 8 15 7 4 17 2 8 15 7 4 17 2 8 15 7 4 17

توجه: منظورم از معادل عددی، مکان عدد در بین حروف الفباست که توجه داشته باشید از صفر شروع می شود. مثلا: A برابر صفر، B برابر یک، C برابر دو و …
حال عدد به دست آمده در دو ردیف را در مبنای 26 با هم جمع می کنیم که می شود:


21 15 23 25 6 8 0 23 8 21 22 15 20 1 19 19 12 9

حالا عدد به دست آمده را معکوس کرده و به معادل حروف الفبایشان تبدیل می کنیم که می شود:


"VPXZGIAXIVWPUBTTMJ"

پس عبارت معادل رمز شده ی کلمه مورد نظر ما به شکل فوق حاصل شد.
برای رمزگشایی نیز از همان کلید استفاده می شود و فقط به جای عمل جمع، از تفریق در مبنای 26 استفاده می کنیم.

این هم از این بحث.
امیدوارم که مفید فایده بوده باشه و از اینکه این مقاله را خواندید ممنونم.
با بهترین آرزوها…
بهروز راد
:wink:

بابک زواری
شنبه 28 آذر 1383, 18:14 عصر
دست شما درد نکنه امیدوارم تا باشه از این مقاله ها و آموزشی ها باشه
بازم ممنون

Hamedm
شنبه 28 آذر 1383, 19:59 عصر
خیلی ممنون
مفید بود

:thnx:

H_r_m
شنبه 28 آذر 1383, 20:04 عصر
:thnx: :thnx: :thnx:

H_r_m
شنبه 28 آذر 1383, 20:09 عصر
:thnx: :thnx: :thnx:

Behrouz_Rad
یک شنبه 29 آذر 1383, 07:17 صبح
:wise1: :موفق:

hmm
یک شنبه 29 آذر 1383, 07:29 صبح
امروزه بانک اطلاعاتی نرم افزار SQL Server که یک نرم افزار کلاینت-سرور است در بیشتر کاربردها به عنوان یک منبع ذخیره سازی قابل اطمینان که ضریب امنیتی بالغ بر 18 برابر بانک Access دارد، مورد استفاده است. (18 لایه امنیتی)
منظور شما از 18 لایه امنیتی چیست؟

Behrouz_Rad
یک شنبه 29 آذر 1383, 07:44 صبح
سلام.
یعنی پیچیدگی الگوریتم ذخیره سازی داده ها در بانک SQL Server، هجده برابر الگوریتم ذخیره سازی داده ها در بانک Access است.
موفق باشید.
بهروز راد
:wise1:

حامد مصافی
یک شنبه 29 آذر 1383, 10:56 صبح
سلام عزیز :wink:

مقاله جالبی بود :موفق:





If MyTextBox.Text = "123456” Then
MsgBox "OK"
Else
MsgBox "Fail"
End If



مثال بالا یکی از موارد اشتباه فاحشی است که در بسیاری از برنامه ها مشاهده شده و کلمه عبور را به راحتی با یک Hex Editor می توان به دست آورد


عزیز ، الان 20 ساله که برنامه نوس ها je2jne رو کشف کردن دیگه کسی همچین اشتباه فاحشی نمیکنه :mrgreen:


در ضمن خدمت دوستانی که میخوان امنیت و رمز گذری رو در حد بالاتری بخونن من مقاله مقدمه ای بر سیستم کدگذاری RSA نوشته استاد وحید نصیری رو توصیه می کنم !
البته من کوچیکتر از اینام که خدمت دوستان کناب معرفی کنم :mrgreen:

Payam Moradi
یک شنبه 29 آذر 1383, 16:01 عصر
سلام
شرمنده کردی. فکر خودت نیستی فکر ما باش. :mrgreen:
دستت درد نکنه پرشین بلاگ رو اذیت کردی:mrgreen:
بازم بنویس.

R_BABAZADEH
جمعه 04 دی 1383, 13:28 عصر
بابا دمت گرم :flower:
:thnx: :thnx:

Behrouz_Rad
جمعه 04 دی 1383, 13:31 عصر
:موفق: :wink: