Search

۱۳۸۹ آذر ۱۵, دوشنبه

hash چیست؟ و موارد استفاده از Hash ...

hash چیست؟
 يک Hash که به آن Checksum ، پيام Digest و يا اثرانگشت ، نيز گفته می شود ، فرآيندی است که بصورت رياضی، حجم يک جريان از داده را به يک طول ثابت کاهش می دهد ( معمولا" 128 و يا 160 بيت ) . عملکرد hash ، مشابه اثرانگشت يک شخص می باشد. اثرانگشت ، پارامتری منحصربفرد به منظور تشخيص هويت افراد بوده و در ادامه با استفاده از آن امکان دستيابی به ساير مشخصات افراد نظير : رنگ چشم ، قد ، جنسيت و ساير موارد دلخواه ، فراهم می گردد . اکثر توابع Hash از لحاظ رمزنگاری دارای عملکردی مشابه توابع رمزنگاری می باشند . در حقيقت ، برخی توابع hash صرفا" تغييرات اندکی را در توابع رمزنگاری ايجاد نموده اند . اکثر عمليات با دريافت يک بلاک از داده شروع و در ادامه با استفاده از يک فرآيند تکرارشونده و بکارگيری يک الگوريتم رمزنگاری ، تغييرات لازم در ارتباط با بيت ها ، اعمال می شود. hashبه عبارتی دیگر هش (Hash, Hash Code, Digest, Message Digest هم نامیده می شود) را می توان به صورت اثر انگشت دیجیتالی یک داده در نظر گرفت. با این روش شما می توانید رشته ای اندازه-ثابت (fixed length) از یک داده به دست آورید که با روش های ریاضی به صورت "یک طرفه" رمزنگاری شده است.


کشف رشته اصلی از رشته هش آن (عملیات معکوس) به صورت کارا تقریبا غیر ممکن است. نکته دیگر اینکه هر داده یک رشته هش شده کاملا منحصر به فرد ایجاد می کند( احتمال یکی شدن رشته های هش دو رشته متفاوت در الگوریتم MD5 یک در 3.4028236692093846346337460743177e+38 می باشد.
. این خواص ، هش کردن را به روشی کارا و ایده آل برای ذخیره سازی کلمات عبور در برنامه های شما تبدیل می کند.
 چرا؟ برای این که حتی اگر یک نفوذگر(Hacker) بتواند به سیستم و بانک اطلاعاتی شما نفوذ کند و بخشی از اطلاعات شما را به دست آورد (شامل کلمات عبور هش شده) نمی تواند کلمات عبور اولیه را از روی آن ها بازیابی کند. توجه کنیدکه: یکی از دو خصوصیت الگوریتم های HASHاینه که معکوس پذیر نیستند! دومی اینه که هرگز دو ورودی متفاوت به خروجی یکسان منجر نمی شوند. هر یک از این دو خصوصیت اگر نقض بشه می گیم الگوریتم شکسته!!! Hash ، دارای ويژگی های مهم زير می باشد : امکان استنتاج ورودی از طريق خروجی وجود ندارد . نمی توان دو ورودی را پيدا کرد که به ازای آنان خروجی يکسانی توليد گردد : احتمال توليد مقادير Hash يکسان برای دو مجموعه متفاوت از داده ها کمتر از 001 /0 درصد است . موارد استفاده از Hash ها Hash ها کلا موارد استفاده کمی دارند که ما در ادامه بحث آن ها را بیان می کنیم: 1) تشخیص درستی یک فایل Verifying file integrity برای مثال زمانی که یک فایل با حجم بالا را دانلود می نماییم می توانیم با به دست آوردن مقدار MD5 آن فایل توسط دستور md5sum و مقایسه آن با مقدار Md5 داده شده توسط سایت مورد نظر از درستی فایلمان اطمینان حاصل کنیم. hash (2کردن کلمه عبور Hashing passwords 3) نشانه گذاری اسناد به روش digitally (امضاهای digitally) که نحوه انجام ان به وضوح در شکل زیر نشان داده شده است: انواع هش •(128 bits, obsolete) MD4 •(128 bits) MD5 • (160 bits)RIPEMD-160 • (160 bits)SHA-1 •(longer versions of SHA-1, with slightly different designs) SHA-256, SHA-384, and SHA-512 انواع مختلفی از الگوریتم های قوی هش کردن برای استفاده در برنامه های کاربردی موجود هستند، محبوب ترین آنها که مورد استفاده برنامه نویسان هستند MD5 و SHA-1(Secure hash algorithm)می باشند. سیستم های قدیمی تر از( DES(Data Encryption Standard استفاده می کردند. این روش 56 بیتی دیگر یک روش قوی هش کردن محسوب نمی گردد. ، الگوریتم های قوی تری مانند SHA-256 و SHA-512 برای موارد خاص مانند امضاهای دیجیتالی توصیه می گردد ولی برای هش کردن کلمات عبوردر برنامه های امروزی SHA-1 هنوز سطح امنیت بسیار خوبی را فراهم می کند. •الگوريتم های hashing ، از يک تابع ايمن رمزنگاری نظير Message Digest 5)MD5) و يا Secure Hash Algoritm)SHA) به منظور توليد يک مقدار Hash مرتبط با داده ورودی استفاده می نمايند . Hash ، يک نوع خاص از رمزنگاری يک طرفه است . برخی افراد ، hashing را به عنوان يک مدل رمزنگاری تلقی می نمايند . Hashing عملا" يک مدل رمزنگاری نمی باشد چراکه Hash نمی تواند رمزگشائی گردد ( بدست آوردن مقدار ورودی با اسنتاد و آناليز مقدار خروجی ) . شکل زير ، نحوه عملکرد الگوريتم SHA-1 ( نسخه شماره يک ، پياده سازی شده در سال 1994 ) را نشان می دهد : •MD5 روشي براي توليد يك چكيده از يك پيام است ( Message Digest ) . چه يك كلمه ، يك عدد ، يك جمله ، يك كتاب چند صد صفحه اي ، يك فايل و ... به او بدهيد ، يك چكيده با طول ثابت 128بيتي توليد ميكند . حالا اين به چه دردي ميخورد ؟ فرض كنيد در حاشيه ء انتخابات پر شور مجلس ( كه قرار دوباره ملت يك حماسه ديگه توش خلق كنند ! و براستي اين مردم جز خلق كردن حماسه به درد ديگري هم ميخورند ؟ :roll: ) قراره وزير كشور نامه اي محرمانه به تمام استانداري هاي كشور ارسال كنه . ( حالا به چه روشي زياد مهم نيست ) اگر اين نامه بين راه توسط افرادي تغيير داده بشه ، دريافت كننده چطور ممكنه بفهمه ؟ اون ماموره و مجبور به اطاعت . خيلي بعيده به تهران تلفن بزنه و استعلام كنه ، شايد اصلا بالاش نوشته باشه محرمانه و اون مجبور باشه بدون اطلاع ديگران بهش عمل كنه ... اگر حالا متن اصلي وزير با مطلب ديگري تغيير داده شده باشه ( مثلا" : نمايندگان شوراي نگهبان رو به حوزه هاي انتخابيه راه نديد ! :twisted: 8) ) چه دردسر بزرگي ايجاد ميشه ...! يكي از راه هاي اعتماد سازي در يك تبادل اطلاعات دو طرفه استفاده از امضاهاي ديجيتال است و چكيده پيام يا همون Message Digest نقش مهمي در اين مهم ايفا ميكنه . پيام شما ( هر چي كه ميخواد باشه ) هميشه داراي يك چكيده 128 بيتي است كه با متدي يكتا تهيه شده و پس از رمزنگاري به انتهاي نامه الصاق ميشود ، دريافت كننده ( كه به عنوان مثال در يك معماري مبتني بر PKI داراي كليد خصوصي - Private Key - خودش هست ) ميتوني با كليد خصوصي خودش چكيده پيام رو ( كه با كليد عمومي - Public key - كد شده ) باز كنه ، بعد متن پيام رو با همون الگوريتم يكتا درهم ريزي كنه ( Hashing ) و بعدش محصول رو با آنچه كه به پيام الصاق شده بود مقايسه كنه . با تكيه به معماري غير متقارن ( Asymmetric ) شناسائي و تصديق هويت ( Authentication ) اين يكي از روشهاي مناسب براي اعتماد سازي است . • MD5 يا Message Digest version 5 در دانشگاه MIT و توسط پروفسور Ronald L. Rivest طراحي شده و متن كامل داستان MD5 رو ميتونيد در آر اف سي شماره 1321 مطالعه كنيد : http://www.faqs.org/rfcs/rfc1321.html اين صفحه وب هم حاوي مقداري سورس كد به زبانهاي مختلف از جمله سي و دلفي و جاوا است كه ميتوني توليد چكيده پيام به روش ام دي فايو رو حمايت كنه : http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html شايد موقع دريافت نرم افزار از برخي سايتهاي معتبر ديده باشيد كه كنار فايلهاي مربوطه نوشته اند MD5 و كنار آن هم رشته اي مثل اين : 900150983cd24fb0d6963f7d28e17f72 ) اين رشته خروجيه abc است ( اينگونه سايتهاي براي ايجاد اعتماد ، از فايلهاي خود با برنامه هائي كه چكيدهء MD5 توليد ميكنند ، امضاي مربوطه را ايجاد و اعلام ميكنند ، شما هم بعد از دريافت ميتونيد با يكي از ابزارهاي متداول همينكار ( روي لينوكس اصلا دستوري به همين نام و به همين مقصود وجود داره ) فايل مربوطه رو چك كنيد تا از صحت محتواي اون مطمئن بشيد . مدتها قبل فردي توانست سايت حمايت كننده SendMail كه ميل سروري معروف روي پلت فرمهاي مبتني بر يونيكس است را هك كرده و بجاي تغيير صفحات وب آن ، نسخه اي حاوي يك تروجان را به عنوان نسخه جديد آپلود كرد و بعد هم به ا راسال خبرنامهء رسمي سايت SendMail باعث شد تعداد زيادي از مديران سرورها جهت نصب نسخه جديد هجوم بيارن و در واقع نسخه محتوي تروجان را دريافت و نصب كنند ( و براستي وقتي سورس باز است چه كسي به خودش زحمت چك كردن اون رو ميده ؟ بقول يكي از اساتيد مرحومم ، مخفي ترين چيز ، چيزيه كه اصلا براي مخفي كردنش تلاش نشده ! ) و اين حركت زيركانه اون هكر باعث شد صدها سايت تحت سيطره اون قرار بگيرن كه البته ناگفته پيداست براي برقراري يك حملهء DDOS ( يا Distributed Denail of service ) به اونها احتياج داشت •الگوريتم رمزنگاري متقارن BlowFish يكي از روشهاي متداول رمزنگاري است . اين الگوريتم با پذيرش كليد عمومي از 32 بيت تا 448 بيت ، جايگزين خوبي براي روشهائي مثل DES است . ( خصوصا در كشورهائي مثل آمريكا كه صدور و فروش نرم افزارهاي داراي سيستم رمزنگاري به خارج از كشور ممنوع و براي استفاده هاي داخلي هم در طول كليد محدوديتهائي وجود داره ) از اين روش امروزه به وفور در نرم افزارهاي گسترده و سازماني استفاده ميشه ، به عنوان مثال Oracle . اين الگوريتم در سال 1993 توسط Bruce Schneier طراحي و توسعه داده شد . كه ميتونيد استفاده كنيد . پياده سازي هاي متعددي از اين الگوريتم به زبانهاي سي ، سي شارپ ، جاوا ، دلفي ، بيسيك وجود داره كه در صورت نياز با يك جستجوي ساده ميتونيد پيداشون كنيد . Collision (تصادم) در Hash زمانی که مقدار Hash دو ورودی متفاوت یکسان باشند می گوییم Collision رخ داده است. اما تا کنون هیچ موردی از Collision دیده نشده است . این امر از این حقیقت ناشی می شود که تعداد مقادیر یک الگوریتم hash بسیار زیاد می باشند.برای مثال یک Hash 128 بیتی میتواند 3.4 x 1038 مقدار ممکن داشته باشد.که معادل 340,282,366,920,938,463,463,374,607,431,768,211,45 6 میباشد. شناسایی اعضا با استفاده از Hash تا کنون نشان داده ایم که بازیابی کلمه عبور اصلی از روی رشته هش تقریبا غیر ممکن است ، خب چگونه برنامه های ما تشخیص دهند که کلمه عبور وارد شده توسط کاربر صحیح است ؟ به سادگی ! با تولید رشته هش کلمه عبور وارد شده توسط کاربر و مقایسه آن با رشته هش ذخیره شده در رکورد بانک اطلاعاتی مربوط به کاربر می توانید متوجه شوید که آیا دو رشته با هم برابرند یا نه. بگذارید با ذکر یک مثال این بحث را ادامه دهیم. Hash Table همانطور که در جستجوی دودویی دیده شد با استفاده از یک ساختمان داده به خصوص به اسم درخت جستجوی دودویی کارایی جستجو را بهبود بخشید یم. رسیدیم. O(logn) به جستجوی دودویی با O(n) در واقع از جستجوی خطی با حال می خواهیم یک ساختمان داده جدید به نام جدول هش را معرفی کنیم که کارایی عمل جستجو را تا افزایش می دهد.O(1) یک جدول هش از دو قسمت تشکیل شده : یک آرایه (جدول واقعی جایی که دادهایی که جستجو می شود ) که به آن تابع هش می گویند.mapping function در آن ذخیره می شود ) و یک تابع نگاشت ( اندیس های آرایه که (integer space ) تابع هش نگاشتی است از فضای ورودی به فضای اعداد صحیح را مشخص می کند . به عبارت دیگر تابع هش روشی را فراهم می کند برای اختصاص دادن اعداد به داده های ورودی به گونه ای که سپس داده ورودی می تواند در اندیس آرایه مطابق باعدد تخصیص داده ذخیره شود.در ادامه مثالی در این رابطه بیان می کنیم: مثال را آغاز می کنیم. یعنی از رشته ها به عنوان داده هایی ابتدا با یک آرایه جدول هش از رشته ها که ذخیره و جستجو می شوند استفاده می کنیم . اندازه جدول هش را در این مثال 12 می گیریم. در مرحله بعد ما به یک تابع هش نیاز دارم. راههای زیادی برای ساختن یک تابع هش وجود دارد. در حال حاضر یک تابع هش ساده را در نظر می گیریم. که یک رشته را به عنوان ورودی میگیرد. مقدار هش برگشتی از تابع برابر مجموع کاراکتر های اسکی است که رشته ورودی را می سازند به پیمانه اندازه جدول: کد: int hash(char *str, int table_size) { int sum; /* Make sure a valid string passed in */ if (str==NULL) return -1; /* Sum up all the characters in the string */ for( ; *str; str++) sum += *str; /* Return the sum mod the table size */ return sum % table_size; } تابع هش را باپارامتر های ("Steve",12) اجرا می کنیم که مقدار 3 حاصل می شود. حال رشته Steve را در جدول ذخیره می کنیم . تابع هش را با پارامتر های ("Spark",12) اجرا میکنیم."Spark" بیایید رشته دیگری را امتحان کنیم: که عدد 6 حاصل می شود. سپس آن را نیز در جدول ذخیره میکنیم. که این بار نیز مقدار 3 حاصل می شود. حال تابع هش را با پارامتر های ("Notes",12) اجرا میکنیم . رشته Notes را نیز در جدول درج می کنیم. حال تابع هش را با پارامتر های( "Notes",12) اجرا میکنیم . که این بار نیز مقدار 3 حاصل می شود. . رشته Notes را نیز در جدول درج می کنیم مشاهده می شود که دو ورودی متفاوت مقدارهش یکسانی دارند و هر دو عنصر باید در یک مکان در آرایه درج شوند که این مساله غیر ممکن است . و همانطور که قبلا نیز ذکر شد به این مساله تصادم گفته (linear probing) می شود. در رابطه با تصادم الگوریتم های زیادی وجود دارد از قبیل اکتشاف خطی و زنجیرسازی جداگانه.بررسی می کنیم. ر ا (Separate Chaining) که ما در اینجا زنجیره سازی جداگانهزنجیره سازی جداگانه به مقدار کمی تغییر در ساختمان دادهمان نیاز دارد. به جای ذخیره سازی مستقیم داده ها در آرایه آنها را در لیست های پیوندی ذخیره می کنیم. هر عنصر آرایه به یکی از این لیست های پیوندی اشاره می کند. زمانی که مقدار هش یک ورودی به دست آمد آن عنصر به لیست پیوندی که در اندیس مورد نظر در آرایه وجود دارد اضافه می شود . از ان جایی که لیست های پیوندی محدودیت در طولشان ندارند مساله تصادم ها حل شده به حساب می آید. اگر دو داده متفاوت مقدار هش یکسانی داشته باشند هر دوی آنها در لیست پیوندی ذخیره می شوند. بیایید مثال بالا را این بار با ساختمان داده تغییر یافته مان بررسی نماییم : دوباره Steve را با مقدار هش 3 به جدولمان اضافه میکنیم: هم چنین Spark با مقدار هش 6 را نیز به جدولمان اضافه می کنیم: حال Notes با مقدار هش 3 (همانند مقدار هش Steve) را اضافه می کنیم: مراحل جستجو مشابه با عمل درج در جئول می باشد. ما مقدار هش داده ای را که می خواهیم جستجو شود را به دست می آوریم. سپس به ان مکان از آرایه می رویم. لیستی که از آن مکان سرچشمه می گیرد (آغاز میشود) را بررسی می کنیم. و می بینیم که چیزی که به دنبال آن هستیم در لیست وجود دارد یا نه . =>تعداد مراحل O(1) می باشد. زنجیره سازی جداگانه (Separate chaining) به ما این امکان را می دهد که مساله تصادم را در یک روش ساده و قدرتمند حل نماییم . با این حال هنوز مشکلاتی وجود دارد . حالتی را فرض کنید که تمام داده های ورودی دارای یک مقدار هش باشند. در این مورد برای جستجوی یک داده باید یک جستجوی خطی با(on) در لیست پیوندی انجام دهیم . پس در بدترین حالت این روش (on)راخواهیم داشت که احتمال آن بسیار کم است . در حال که در بهترین حالت و حالت متوسط (O1 )را خواهیم داشت! آیا شما معتبر هستید ؟ همانگونه که در ابتدای بخش فوق اشاره گردید ، رمزنگاری فرآیندی است که بر اساس آن اطلاعات ارسالی از یک کامپیوتر برای کامپیوتر دیگر ، در ابتدا رمز و سپس ارسال خواهند شد. کامپیوتر دوم ( گیرنده ) ، پس از دریافت اطلاعات می بایست ،اقدام به رمزگشائی آنان نماید. یکی دیگر از فرآیندهای موجود بمنظور تشخیص ارسال اطلاعات توسط یک منبع ایمن و مطمئن ، استفاده از روش معروف " اعتبار سنجی " است . در صورتیکه اطلاعات "معتبر " باشند ، شما نسبت به هویت ایجاد کننده اطلاعات آگاهی داشته و این اطمینان را بدست خواهید آورد که اطلاعات از زمان ایجاد تا زمان دریافت توسط شما تغییر پیدا نکرده اند. با ترکیب فرآیندهای رمزنگاری و اعتبار سنجی می توان یک محیط ایمن را ایجاد کرد . بمنظور بررسی اعتبار یک شخص و یا اطلاعات موجود بر روی یک کامپیوتر از روش های متعددی استفاده می شود : ● رمز عبور . استفاده از نام و رمز عبور برای کاربران ، متداولترین روش "اعتبار سنجی " است . کاربران نام و رمز عبور خود را در زمان مورد نظر وارد و در ادامه اطلاعات وارد شده فوق ، بررسی می گردند. در صورتیکه نام و یا رمز عبور نادرست باشند ، امکان دستیابی به منابع تعریف شده بر روی سیستم به کاربر داده نخواهد شد. ● کارت های عبور . این نوع کارت ها دارای مدل های متفاوتی می باشند. کارت های دارای لایه مغناطیسی ( مشابه کارت های اعتباری ) و کارت های هوشمند ( دارای یک تراشه کامپیوتر است ) نمونه هائی از کارت های عبور می باشند. ● امضای دیجتالی . امضای دیجیتالی، روشی بمنظور اطمینان از معتبر بودن یک سند الکترونیکی ( نظیر: نامه الکترونیکی ، فایل های متنی و ... ) است . استاندارد امضای دیجیتالی (DSS) ، بر اساس نوع خاصی از رمزنگاری کلید عمومی و استفاده از الگوریتم امضای دیجیتالی (DSA) ایجاد می گردد.الگوریتم فوق شامل یک کلید عمومی ( شناخته شده توسط صاحب اولیه سند الکترونیکی - امضاء کننده ) و یک کلید عمومی است . کلید عمومی دارای چهار بخش است . در صورتیکه هر چیزی پس از درج امضای دیجیتالی به یک سند الکترونیکی ، تغییر یابد ، مقادیر مورد نظری که بر اساس آنها امضای دیجیتالی با آن مقایسه خواهد شد ، نیز تغییر خواهند کرد. سیستم های متعددی برای "اعتبار سنجی " تاکنون طراحی و عرضه شده است . اکثر سیستم های فوق از زیست سنجی برای تعیین اعتبار استفاده می نمایند. در علم زیست سنجی از اطلاعات زیست شناسی برای تشخیص هویت افراد استفاده می گردد. برخی از روش های اعتبار سنجی مبتنی بر زیست شناسی کاربران ، بشرح زیر می باشند : پیمایش اثر انگشت ( انگشت نگاری ) پیمایش شبکیه چشم پیمایش صورت مشخصه صدا یکی دیگر از مسائل مرتبط با انتقال اطلاعات ، صحت ارسال اطلاعات از زمان ارسال و یا رمزنگاری است . می بایست این اطمینان بوجود آید که اطلاعات دریافت شده ، همان اطلاعات ارسالی اولیه بوده و در زمان انتقال با مشکل و خرابی مواجه نشده اند. در این راستا از روش های متعددی استفاده می گردد :

هیچ نظری موجود نیست: