رمزنگاری مقدماتی : HASH و HMAC

رمزنگاری مقدماتی به زبان ساده : بررسی مفاهیم و تفاوت HMAC-MAC و HASH
رمزنگاری مقدماتی به زبان ساده : بررسی مفاهیم و تفاوت HMAC-MAC و HASH


باسلام در این بخش به سراغ مفهوم Hash و نحوه رسیدن به Integrity توسط اون میرسیم و اهمیت HMAC رو هم بررسی میکنیم

هش یا (Hash) چیست ؟ یک فرمول ریاضی برای تبدیل یک رشته با طول دلخواه به یک عبارت که مثل اثرانگشت برای اون رشته میمونه

برای مثال اگر ما بیاییم و جایگاه عددی هر حرف در زبان انگلیسی رو در نظر بگیریم به عنوان عبارت ریاضی مون ، عبارت hello رو میاییم درنظر میگیریم و میبینیم عدد جایگاه هر حرف چنده و اونارو باهم جمع میزنیم ، اگر این کارو بکنیم به 52 میرسیم ، این 52 میشه اون اثر انگشتی که عبارت یا همون رشته hello داره

به 52 یا عبارت خروجی هش یا همون اثرانگشت ما Digest میگیم یا Checksum هم میگن بعضی جاها

حالا اگر ما یه تغییری توی پیام ورودی یا همون رشته مون بدیم باید اثر انگشت عوض شده باشه، ما عبارت cello رو با همون فرمول ریاضی مون هش میگیریم و اینبار اثرانگشتش میشه 47 !

یک الگریتم هش باید چند تا قابلیت داشته باشه که اینجا به زبان ساده به اون ها اشاره میکنم :

1- برگشت پذیر نباشه : الگریتم هش یک الگریتم یک طرفه هست ، یعنی اگر ما از یک ورودی به یک خروجی رسیدیم ، نباید بتونیم از خروجی دوباره به ورودی برگردیم ! یعنی از اثر انگشت نباید به رشته و عبارت ورودی برسیم ! اگر الگریتمی برگشت پذیر باشه یعنی خرابه و آسیب پذیره !!

(توی مقاله قبلی که Encoding رو بررسی کردیم واژه دوطرفه رو بکار بردیم ،اینجا میفهمید یعنی چی)

2 - مقدار خروجی ثابت باشه : عبارت Digest یا خروجی هش باید همیشه مقدار ثابتی داشته باشه و اصلا به اندازه ورودی ربط نداشته باشه

3- تغییر کلی هش با تعویض یک کاراکتر : اگر حتی یک کاراکتر از رشته ورودی تغییر پیدا کنه باید کل هش خروجی (digest) عوض بشه (جلوتر بررسی میکنیم)

4 - دو مقدار متفاوت خروجی یکسان : یک الگریتم هش نباید وقتی مقادیر متفاوتی میگیره هش یکسان برگردونه (این مورد یکم نیاز به توضیح داره)

برای درک مشکل الگریتم که مربوط به ورودی و خروجی میشه به عکس زیر توجه کنید ، اگر یک الگریتم سالم باشه ، ما اگر یه ورودی رو چند بار بهش بدیم باید یه خروجی رو بهمون بده، آمااا اگر یه الگریتم مشکل داشته باشه و ما یه ورودی رو چند بار بهش بدیم ، خروجی های متفاوتی برمیگردونه (این مورد نادره) ، و اگر یه الگریتم خراب باشه ، ما اگر بهش دو یا چند ورودی متفاوت بدیم ، خروجی یکسان برمیگردونه که این یعنی الگریتم خرابه :)

Collision in Hashing Algorithms
Collision in Hashing Algorithms

Collision یا تداخل در الگریتم چیست؟

قبل اینکه من اختلال یا کالیژن رو براتون توضیح بدم بزارید یه قاعده به اسم قاعده لانه کبوتر یا pigeonhole principle ، خیلی سادست ، میگه اگر ما یه اتاقک یا خونه کبوتر داشته باشه که 8 تا لونه توشه و 8 تا کبوتر داریم ، خب همه میرن تو یه لونه و مشکلی نیست ، اگر یه کبوتر اضافی اینجا بیاد ، پس یک لونه باید دوتا کبوتر رو تو خودش جا بده ، پس اینجا ما اختلال داریم ،خیلــــــی ساده

حالا تا بحث اختلال و مشکل تو الگریتم بازه بزارید خیلی ساده از لحاظ ریاضی براتون توضیح بدم چطوری یک الگریتم به Collision یا تصادم میخوره و چطوری کم میاره ، ببینید توی ریاضی ما یه مفهوم داریم به اسم توان ، وقتی میگیم یه عدد به یه توانی یعنی اون عدد رو چند بار در خودش ضرب میکنیم ، مثلا عدد 2 به توان 2 میشه 4 ، یعنی عدد 2 رو دوبار در خودش ضرب میکنیم ، وقتی میگیم 3^2 یعنی دو به توان سه ، یعنی عدد دو رو سه بار در خودش ضرب میکنیم ، توی دنیای کامپیوتر ما 0و1 فقط داریم ، یعنی کلا دو حالت ، حالا اگر ما یه الگریتم خودمون بسازیم که 3 بیت باشه ، الگریتم ما چند حالت خواهد داشت؟ دو به توان سه یا 8 حالت ، حالا اگر با این الگریتم ما بیاییم و هش بگیریم ، الگریتممون میتونه 8 تا فایل رو هش بگیره ، اما اگر ما 9 تا فایل بهش بدیم چون بیشتر از 8 تا حالت نداره پس فایل 9 ام هشش تکراری میشه با یکی از 8 فایل قبلی ! و اینطوری الگریتم به Collision خورده و حالت پایین سمت چپ توی عکس بالا براش رخ میده ، این مفهومو تو ذهنتون داشته باشید و بریم که ازش استفاده کنیم ..

Collision in Hashing Algorithms
Collision in Hashing Algorithms

انواع الگریتم های Hashing :

ما اینجا انواع الگریتم های هشینگ یا همون Hashing رو داریم که میخوایم بررسی کنیم ببینیم کدوم امن هستن ، الگریتم اول MD5 هست که خروجی 128 بیتی تولید میکنه (یعنی 128^2 فایل رو میتونه هش بگیره) و این الگریتم دیگه امن نیست چون توش Collision پیدا شده ، الان نمیتونم فنی تحلیل کنم براتون ولی قبول کنید :) البته اگر ازش برای مقایسه دوتا فایل توی سیستم استفاده میکنید اوکیه ولی اگر میخواید توی سازمان یا در سطح کلان ازش استفاده کنید اصلا ایده خوبی نیست

الگریتم بعدی SHA1وSHA هست که خروجی 160 بیتی میده ، براش حملاتی کشف شده ولی بعضیاش فقط در حد تئورین و عملی نشدن ، و توصیه شده ازش استفاده نشه تا حد امکان

SHA2 الگریتم بعدی هست که امنیت خوبی داره و امن در نظر گرفته شده ،ولی باز حمله براش هست که ما اونو تو مقاله پیشرفته بررسی میکنیم ، ولی درکل همه ورژن های SHA2 امنیت خوبی دارن

الگریتم بعدی SHA3 هست که این بار برخلاف SHA1 یا SHA2 توسط NSA ساخته نشده پس امکان شنودش خیلی کمتره و توسط عموم ساخته و پیشنهاد شده و ساختار فرمول ریاضیش کلا عوض شده و امن ترین در حال حاضره

الگریتم بعدی RIPEMD هست که برای جبران الگریتم های دیگه ساخته شد که سرعتش بالاتر باشه که به طبع گند زدن به امنیتش و به مرور زمان توی مقادیر خروجی کم Collision پیدا شد ولی اگر میخواید استفاده کنید از 320 بیتش استفاده کنید و 320 بیتش خیلی امنه ، به حدی که توی PGP که جلوتر بررسیش میکنیم و حتی توی بلاکچین هم ازش استفاده میشه

انواع الگریتم های هشینگ و امنیت آنها
انواع الگریتم های هشینگ و امنیت آنها

استفاده از ابزار OpenSSL و سایر ابزار ها برای Hashing :

ما بجز سایت های انلاین چندین ابزار داریم برای هش:

hpn# echo -n hello | md5sum
5d41402abc4b2a76b9719d911017c592

ما عبارت hello رو با دستور echo و پایپ ریختیم تو ابزار md5sum ، منتها دقت کنید به سویچ n- که اگر نذاریم هش کلا اشتباه میشه چون میاد و بعد عبارت یه Return قرار میده و ما باید اونو حذف کنیم

همین روند برای ابزار sha1sum هست که مختص الگریتم SHA1 ،هست برای SHA2 ما sha224sum و .. داریم (عدد بیتش بعدش میاد حتما) و برای SHA3 هم ما باید بریم سراغ ابزار و کتابخونه قدرتمند Openssl که در سری مقدماتی من کمی ازشو بررسی میکنم ولی تو سری پیشرفته کامل باهاش کار میکنیم

hpn# echo -n hello | sha224sum
ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193 
hpn# echo -n hello | openssl dgst -sha3-224
SHA3-224(stdin)= b87f88c72702fff1748e58b87e9141a42c0dbedc29a78cb0d4a5cd81

ابزار openssl کلا یکم کارباهاش متفاوته و اینجا فقط قصد معرفی شو داشتم ، خیلی ابزار کاملیه و بهتره کلا برید سراغ این برای هرکاری که توی رمزنگاری دارید، من حتی خودم برای هش md5 و sha2 هم میرم سراغ این ابزار

یه نکته ای رو بزارید بررسی کنیم ، قانون سوم و دوم هشینگی که بالاتر گفتم تحت عنوان "مقدار خروجی ثابت باشه" و "تغییر کلی هش با تعویض یک کاراکتر" رو میخوایم باهم اینجا بررسی کنیم ببینیم یعنی چی :

در اینجا میخوایم یه کتاب رو باهم هش بگیریم ، این کتاب سایزش مثل کلمه hello انگلیسی 5 تا حرف نیست و 4 هزار کلمه و 21 هزار کاراکتر یا حرف داره ، من نسخه کتاب رو یه کپی گرفتم و یه حرف آخر از اخرین کلمه این کتاب رو از کوچیک به بزرگ تغییر دادم f->F ، شما میتونید با هر متنی که میخواید این کارو بکنید و تست کنید ، وقتی wc میگیریم میبینیم هیچ فرقی ندارن (تنها تفاوتشون اینه که یه حرف از یه کلمه از این کتاب رو ما بجای کوچیک ، به شکل بزرگ نوشتیم که اصلا تفاوتی محسوب نمیشه از دید ابزار) :

hpn# ls
Alice-Book1.txt  Alice-Book2.txt
hpn# wc Alice-Book*
325  4286 21242 Alice-Book1.txt
325  4286 21242 Alice-Book2.txt
650  8572 42484 total

حالا جفتشو با هر الگریتمی که خواستید هش بگیرید ، من با md5 میگیرم ، فرقی نداره :

md5sum  Alice-Book*
726e3074fa8e1a87221a317633996f71  Alice-Book1.txt
079ac160dc49cb0756720db8bca1dc12  Alice-Book2.txt

هش دوتا فایل کلا عوض شد و تغییر کرد ، و نکته ای که هست اینه که هیچ تفاوت فاحشی در حتی تعداد کاراکترم نبود ولی هش عوض شد ! یعنی چی ؟ این همون ویژگی سوم هشه که با یه تغییر کوچیک حتی ، کل هش باید عوض بشه ؛ نکته دوم ویژگی دوم هش بود که مقدار خروجی باید ثابت باشه ، ما کلمه 5 حرفی دادیم 32 کاراکتر هش md5 گرفتیم ، یه کتاب 21 هزار حرفی هم دادیم بازم 32 کاراکتر خروجی گرفتیم :)

(دقت کنید که اگر خواستید هش فایل رو بگیرید میتونید با cat بخونیدش و بعد | کنید توی ابزار ها ، مثل echo که بالاتر انجام دادیم)

نکته : موقع گرفتن هش از یک عبارت هیچوقت کنارش هیچگونه "اسپیس" و "اینتر" نگذارید چون هش بلکل عوض میشه !

MAC و HMAC چیست ؟

سناریو شماره 1
سناریو شماره 1

خب حالا فرض کنید میخوایم یه فایل رو بر بستر اینترنت منتقل کنیم و از Hash استفاده کنیم برای اینکه به Integrity برسیم ، ما فایل رو هش میکنیم و طبق عکس سناریو شماره 1 فایل رو با هش میفرستیم ، حالااا اگر یه اتکر وسط راه باشه و فایل رو دستکاری کنه و هش جدید بگیره و بفرستتش طبق عکس سناریو شماره 2 ، پس هش چی میشه ؟

سناریو شماره 2
سناریو شماره 2
سناریو شماره 3
سناریو شماره 3

اینجاست که مکانیزم HMAC به کار میاد ، به بیان ساده قبل از ارسال فایل ، ما میاییم و از فایلمون به همراه یک کلید باهم هش میگیریم و میفرستیم ، اینطوری اگر اتکری حین تبادل فایل رو بگیره و دستکاری کنه و با هش جدید بفرسته ، چون کلید رو نداره ، وقتی فایل به مقصد میرسه قشنگ معلوم میشه که یه خبرای هست :)

کلید حالا چطوری منتقل میشه ؟ انتقال و توافق سر کلید یه بحث مفصلیه و در این سری به طول خلاصه دربارش صحبت میکنیم و در مقاله پیشرفته کامل بررسیش میکنیم ، ولی برای مقدمات بدونید که ما کلیدو از دو طریق به اشتراک میگذاریم ، یکی Out Of Band و دومی In Band ، روش OOB به این صورته که این دو کلید رو توسط یه راه خارجی و فیزیکی ، یا در زمان گذشته به اشتراک بگذارن، مثلا از قبل همدیگه رو دیدن و سر کلید توافق کردن ، یا تلفن زدن یا ایمیل فرستادن و... و کلید رو جفتشون دارن ، ولی روش In Band به این صورته که شما درجا و در آن واحد بدون هیچ گونه تماس فیزیکی و بدون اینکه از قبل چیزی به اشتراک گذاشته باشی ، کلید رو میسازی و باهم به صورت امن رد و بدل میکنید ! جلوتر به این مورد میرسیم فقط خواستم دید داشته باشید !

کانسپت MAC همون کلیدیه که به اشتراک گذاشته شده از قبل ، ولی الان زیاد درگیرش نشد چون بحث MAC-KMAC و HMAC به جزء در سری بعدی بررسی خواهد شد

به این سایت سر بزنید و از گزینه هاش بخش Hash function و HMAC رو خودتون تست بکنید ، خیلی سایت عالی ایه :

https://cryptii.com/

دونستن این مفهوم برای وب کارا خیلی واجبه :)
اگر به زبان ساده یا غیر علمی توضیح دادم چون این مقاله برای مبتدی هاست ، در سری پیشرفته با اصطلاحات علمی و رفرنس و کامل بررسی میکنیم همه چیو ;)

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