درهم سازی یا hash چیست؟

یک Hash (توابع درهم سازی) که به آن Checksum ، پیام Digest و یا اثرانگشت ، نیز گفته می شود، فرآیندی است که بصورت ریاضی، حجم یک جریان از داده را به یک طول ثابت کاهش می دهد ( معمولا” ۱۲۸ و یا ۱۶۰ بیت ) .

درهم سازی

درهم سازی

عملکرد hash ، مشابه اثرانگشت یک شخص می باشد. اثرانگشت ، پارامتری منحصربفرد به منظور تشخیص هویت افراد بوده و در ادامه با استفاده از آن امکان دستیابی به سایر مشخصات افراد نظیر : رنگ چشم ، قد ، جنسیت و سایر موارد دلخواه ، فراهم می گردد . اکثر توابع Hash از لحاظ رمزنگاری دارای عملکردی مشابه توابع رمزنگاری  می‎باشند. در حقیقت، برخی توابع درهم سازی صرفا تغییرات اندکی را در توابع رمزنگاری ایجاد نموده اند. اکثر عملیات با دریافت یک بلاک  از داده  شروع و در ادامه با استفاده از یک فرآیند تکرارشونده و بکارگیری یک الگوریتم رمزنگاری، تغییرات لازم در ارتباط با بیت ها، اعمال می شود.

 تعریف دقیق تر از توابع درهم سازی یا همان hash function

هش (Hash, Hash Code, Digest, Message Digest هم نامیده می شود) را می توان به صورت اثر انگشت دیجیتالی یک داده در نظر گرفت.  با این روش شما می توانید رشته ای با اندازه ثابت (fixed length) از یک داده به دست آورید که با روش های ریاضی به صورت “یک طرفه” رمزنگاری شده است.

کشف رشته اصلی از رشته هش آن (عملیات معکوس)  کاری تقریبا  غیر ممکن است. نکته دیگر اینکه هر داده یک رشته هش شده کاملا  منحصر به فرد ایجاد می کند( احتمال یکی شدن رشته های هش دو رشته متفاوت در الگوریتم MD5 یک در ۳٫۴۰۲۸۲۳۶۶۹۲۰۹۳۸۴۶۳۴۶۳۳۷۴۶۰۷۴۳۱۷۷e+38 می باشد.  این خواص، هش کردن را به روشی کارآ و ایده آل برای ذخیره سازی کلمات عبور در برنامه های شما تبدیل می کند. دلیل این موضوع این است که حتی اگر یک نفوذگر(Hacker) بتواند به سیستم و بانک اطلاعاتی شما نفوذ کند و بخشی از اطلاعات شما را به دست آورد (شامل کلمات عبور هش شده) نمی تواند کلمات عبور اولیه را از روی آن ها بازیابی کند.

 توجه کنید که :

یکی از دو خصوصیت الگوریتم های درهم سازی این است که معکوس پذیر نیستند! دومی اینه که هرگز دو ورودی متفاوت به خروجی یکسان منجر نمی شوند. هر یک از این دو خصوصیت اگر نقض بشود به معنای شکسته شدن الگوریتم می‎باشد!

درهم سازی ، دارای ویژگی های مهم زیر می باشد :

۱- امکان استنتاج ورودی از طریق خروجی وجود ندارد.

۲- نمی توان دو ورودی را پیدا کرد که به ازای آنان خروجی یکسانی تولید گردد، در حقیقت احتمال تولید مقادیر Hash یکسان برای دو مجموعه متفاوت از داده ها کمتر از ۰۰۱ /۰  درصد است .

 

موارد استفاده از توابع درهم ساز

    Hash ها کلا موارد استفاده زیاد و متفاوتی دارند که ما در ادامه بحث آن ها را بیان می کنیم:

۱) تشخیص درستی یک فایل Verifying file integrity

برای مثال زمانی که یک فایل با حجم بالا را دانلود می نماییم می توانیم با به دست آوردن مقدار MD5 آن فایل توسط دستور md5sum  و مقایسه آن  با مقدار Md5  داده شده توسط سایت مورد نظر  از درستی فایلمان اطمینان حاصل کنیم.

hash (2کردن کلمه عبور Hashing passwords

 ۳) نشانه گذاری  اسناد به روش digitally   (امضاهای digitally)

انواع توابع هش

  • (۱۲۸ bits, obsolete) MD4
  • (۱۲۸ bits) MD5
  • (۱۶۰ bits)RIPEMD-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 استفاده می کردند. این روش ۵۶ بیتی دیگر  یک روش قوی هش کردن محسوب نمی گردد.

الگوریتم های قوی تری مانند SHA-256 و SHA-512  برای موارد خاص مانند امضاهای دیجیتالی توصیه می گردد ولی برای هش کردن کلمات عبوردر برنامه های امروزی SHA-1 هنوز سطح امنیت بسیار خوبی را فراهم می کند.

الگوریتم های hashing ، از یک تابع ایمن رمزنگاری نظیر  Message Digest 5)MD5) و یا Secure Hash Algoritm)SHA) به منظور تولید یک مقدار Hash  مرتبط با  داده ورودی استفاده می نمایند .

توابع درهم سازی،  یک نوع خاص از رمزنگاری یک طرفه محسوب می‎شوند. برخی افراد ، hashing  را به عنوان یک مدل رمزنگاری تلقی می نمایند. Hashing عملا” یک مدل رمزنگاری نمی باشد چراکه Hash نمی تواند رمزگشائی گردد ( بدست آوردن مقدار ورودی با اسنتاد و آنالیز مقدار خروجی ).

MD5 روشی برای تولید یک چکیده از یک پیام است ( Message Digest ). چه یک کلمه، یک عدد، یک جمله، یک کتاب چند صد صفحه ای، یک فایل و … به او بدهید، یک چکیده با طول ثابت ۱۲۸بیتی تولید میکند. حالا توابع درهم سازی چه کاربردی دارند ؟ فرض کنید در حاشیه‎ی انتخابات پر شور مجلس، قراره وزیر کشور نامه ای محرمانه به تمام استانداری های کشور ارسال کند. اگر این نامه بین راه توسط افرادی تغییر داده بشود، دریافت کننده چطور باید متوجه موضوعی به این مهمی شود؟

یکی از راه های اعتماد سازی در یک تبادل اطلاعات دو طرفه استفاده از امضاهای دیجیتال است و چکیده پیام یا همون Message Digest نقش مهمی در این مهم ایفا میکند .یک  پیام شما همیشه دارای یک چکیده ۱۲۸ بیتی است که با متدی یکتا تهیه شده و پس از رمزنگاری به انتهای نامه الصاق میشود، دریافت کننده ( که به عنوان مثال در یک معماری مبتنی بر PKI دارای کلید خصوصی – Private Key – خودش هست ) میتونی با کلید خصوصی خودش چکیده پیام رو ( که با کلید عمومی – Public key – کد شده ) باز کند، بعد متن پیام رو با همون الگوریتم یکتا درهم ریزی کنه ( Hashing ) و بعدش محصول رو با آنچه که به پیام الصاق شده بود مقایسه کنه. با تکیه به معماری غیر متقارن ( Asymmetric ) شناسائی و تصدیق هویت ( Authentication ) این یکی از روشهای مناسب برای اعتماد سازی است .

MD5 یا Message Digest version 5 در دانشگاه MIT و توسط پروفسور Ronald L. Rivest طراحی شده و متن کامل داستان MD5 رو میتونید در آر اف سی شماره ۱۳۲۱ مطالعه کنید : http://www.faqs.org/rfcs/rfc1321.html

این صفحه وب هم حاوی مقداری سورس کد به زبانهای مختلف از جمله سی و دلفی و جاوا است که میتونی تولید چکیده پیام به روش ام دی فایو رو حمایت کنه :

http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html

نکته پایانی : شاید موقع دریافت نرم افزار از برخی سایتهای معتبر دیده باشید که کنار فایلهای مربوطه نوشته اند MD5 و کنار آن هم رشته ای مثل این :

۹۰۰۱۵۰۹۸۳cd24fb0d6963f7d28e17f72 ) این رشته خروجیه abc است (

  اینگونه سایتهای برای ایجاد اعتماد ، از فایلهای خود با برنامه هائی که چکیدهء MD5 تولید میکنند ، امضای مربوطه را ایجاد و اعلام میکنند ، شما هم بعد از دریافت میتونید با یکی از ابزارهای متداول همینکار ( روی لینوکس اصلا دستوری به همین نام و به همین مقصود وجود داره ) فایل مربوطه رو چک کنید تا از صحت محتوای اون مطمئن بشید.

مدتها قبل فردی توانست سایت حمایت کننده SendMail که میل سروری معروف روی پلت فرمهای مبتنی بر یونیکس است را هک کرده و بجای تغییر صفحات وب آن ، نسخه ای حاوی یک تروجان را به عنوان نسخه جدید آپلود کرد و بعد هم به ا راسال خبرنامهء رسمی سایت SendMail باعث شد تعداد زیادی از مدیران سرورها جهت نصب نسخه جدید هجوم بیارن و در واقع نسخه محتوی تروجان را دریافت و نصب کنند ( و براستی وقتی سورس باز است چه کسی به خودش زحمت چک کردن اون رو میده ؟ بقول یکی از اساتید مرحومم ، مخفی ترین چیز ، چیزیه که اصلا برای مخفی کردنش تلاش نشده ! ) و این حرکت زیرکانه اون هکر باعث شد صدها سایت تحت سیطره اون قرار بگیرن که البته ناگفته پیداست برای برقراری یک حملهء DDOS ( یا Distributed Denail of service ) به اونها احتیاج داشت

الگوریتم رمزنگاری متقارن BlowFish یکی از روشهای متداول رمزنگاری است . این الگوریتم با پذیرش کلید عمومی از ۳۲ بیت تا ۴۴۸ بیت ، جایگزین خوبی برای روشهائی مثل DES است . ( خصوصا در کشورهائی مثل آمریکا که صدور و فروش نرم افزارهای دارای سیستم رمزنگاری به خارج از کشور ممنوع و برای استفاده های داخلی هم در طول کلید محدودیتهائی وجود داره )

از این روش امروزه به وفور در نرم افزارهای گسترده و سازمانی استفاده میشه ، به عنوان مثال Oracle . این الگوریتم در سال ۱۹۹۳ توسط Bruce Schneier طراحی و توسعه داده شد .

توضیحات مفیدی برای این الگوریتم اینجا : http://www.schneier.com/blowfish.html است که میتونید استفاده کنید . پیاده سازی های متعددی از این الگوریتم به زبانهای سی ، سی شارپ ، جاوا ، دلفی ، بیسیک وجود داره که در صورت نیاز با یک جستجوی ساده میتونید پیداشون کنید .

برای آشنایی بیشتر با Hash Function ها به این لینک مراجعه کنید.