پروازی بر دنیای امنیت شبکه (قسمت شانزدهم) – مفاهیم رمزنگاری(بخش دوم)

با سلام و عرض خسته‌نباشید! در ادامه قسمت قبلی از این سری آموزشی، امروز با ادامه مبحث رمزنگاری و رمزگشایی در خدمتتون هستم و امروز میخواهیم درمورد هش‌ها، امضاهای دیجیتال و... صحبت کنیم.


هَـش‌ها(Hashes)

فرآیندِ Hashing ویا هَش‌کَردن، متدی برای احراز و Verify کردنِ Data Integrity(دُرُستی و دست‌نخورده بودنِ دیتا) میباشد. مثل زمانی که شما از سایت‌های متفرقه IOSهای گوناگونِ سیسکو را دانلود میکنید وبا استفاده از بررسی MD5 آنها با MD5موجود در سایت سیسکو، از دست‌‌نخورده بودن و عدم خراب بودن فایل، اطمینان حاصل میکنید. فرآیند انجام Hashing فرآیندی است که یک‌تکه داده را دریافت میکند و با استفاده از یکسری پردازش‌ها و الگوریتم‌ها، یک مقدار Hashبا طول ثابت میسازد؛ یعنی چه 5کاراکتر را به تابع Hashing خود تحویل دهید وچه 10صفحه مَتن، همیشه و همیشه یک رشته‌متنی حاوی اعداد و حروف با طول یکسان(مثل 32کاراکتر) دریافت خواهید کرد. این فرآیند یک‌طرفه میباشد، یعنی اینکه شما هیچگاه نمیتواند از رشته‌هش دریافتیِ خود، داده اصلی را بازیابی کنید(بصورت عادی و معمول). نتیجه Hash کردن داده‌ها، همیشه و همه‌جا یکسان است، یعنی اینکه اگر به عنوان مثال از الگوریتم MD5 استفاده کنید، هرجا که داده را به الگوریتم بدهید، پاسخ شما همیشه یکسان میباشد(اگر داده دست‌نخورده باشد و درآن تغییری ایجاد نشده باشد). به عنوان مثال، در زیر کلمه NetworkBaz را با استفاده از الگوریتم MD5 هَش کرده‌ایم:

DF8C2A8ACAA42F6E80FBDD9B0FE30DF5

برای بررسی مثالی دیگر، فرض کنید که در شبکه، فرستنده تمامی پکت‌های ارسالی‌اش را هش میکند وهمراه با پکت به سمت گیرنده ارسال میکند؛ گیرنده پس‌از دریافت بسته، آنرا Hash میکند و سپس آنرا با Hash ارسالی از طرف فرستنده مقایسه میکند؛ درصورتی که هش‌ها یکسان باشند به‌این معنی است که داده در بین‌راه دست نخورده‌است و به‌صورت کامل و سالم دریافت شده‌است. از معروف‌ترین انواع هش‌ها میتوان موارد زیر را نام برد:

  • Message digest 5 (MD5): 128-bit
  • Secure Hash Algorithm(SHA-1): 160-bit
  • Secure Hash Algorithm(SHA-2): between 224-bit and 512-bit

HMAC

ـHashed Message Authentication Code یا همان HMAC از همان مکانیزم Hashing استفاده میکند، بعلاوه‌ی اینکه دارای یک نکته بسیار جالب میباشد؛ بجای استفاده از یک هش که هرکسی میتواند براحتی آنرا برای خود محاسبه کند، از یک کلید مخفی(Secret Key) در الگوریتم برای Hashکردن استفاده میکند که فقط دیوایس‌های درارتباط بایکدیگر آن کلید را دارند. با استفاده از این روش، حتی اگر دربین راه، هکر قصد داشته باشد که پکت را شنود کند ویا اطلاعات و هش خودش را Inject کند، شکست میخورد و نمیتواند اینکاررا انجام دهد؛ چراکه فقط فرستنده و گیرنده از آن کلید در باخبر هستند وبا استفاده از این روش پکت‌هارا براحتی Verify میکنند.

امضای‌دیجیتال(Digital Signature)

در دنیای واقعی، وقتی شما چیزی‌را امضا میکنید به‌این معنی می‌باشد که برمواردی که در آن کاغذ ذکر شده‌است تعهد دارید ویا حداقل آن امضا نمایانگر اینست که شما "همان شخصی میباشید که ادعا میکنید". در دنیای رمزنگاری، یک امضای‌دیجیتال دارای 3 مزیتِ‌مهم میباشد:

  • احرازهویت(Authentication)
  • دُرُستی و سالم‌بودن‌ِداده(Data integrity)
  • ـNon-repudiation

امضاهای‌دیجیتال در عمل

یکی از بهترین روش‌های درکِ عملکردِ Digital Signatureها اینست که مطالب گفته‌شده در قسمت‌قبلی درمورد "کلیدهای Public و Private، رمزنگاری(Encryption) و Hashing" را به‌یاد آورید. فرض کنید دو دیواس داریم با نام‌های A و B. این دو دیوایس میخواهند که با یکدیگر ارتباط VPN برقرار کنند وهمچنین برای اطمینان ازاینکه درحال صحبت با دیوایسِ‌صحیح میباشند میبایستی یکدیگر را احرازهویت کنند؛ درنتیجه برای اینکار میخواهند که از Digital signatureها برای Verify کردن یکدیگر استفاده‌کنند. هردوی این دیوایس‌ها میبایستی Trustedبودن خودرا ثابت کنند، اما برای سادگی، ما دراینجا بصورت یکطرفه این موضوع را بررسی میکنیم:

قبل از هرچیز، میبایستی بدانید که دیوایس A و B هردو دارای Public-private key-pair میباشند وهمچنین هردو دارای امضای‌دیجیتال از یک Certificate authority (یا به اختصار CA) میباشند که صحت هر دیوایس را تضمین میکند.(درمورد CAها بعدا بصورت مفصل صحبت خواهیم کرد.) اگر شما یک Digital Certificate را باز کنید، میتوانید نام آن موجودیت(به عنوان مثال دیوایس A) را ببینید و همچنین Public-key همان دیوایس A هم در همان Certificate قابل دسترسی است(چراکه درزمان درخواست دیوایس A از CA برای Digital Certificate، دیوایس A این Public-keyرا در اختیار CA قرار داده است)؛ همچنین یک Digital Signature هم برای خودِ CA در آن Certificate وجود خواهد داشت.

پس تا اینجای‌کار، هردوی دیوایس‌های A و B ما به CAمدنظر اعتماد دارند و Digital Certificateهای خودرا از آن دریافت کرده‌اند. دیوایس A یک پکت را برمیدارد و برای آن یک Hash ایجاد میکند؛ سپس این هش را با استفاده از Private-key خودش، Encrypt میکند و این عبارت رمزشده را به پکت اضافه و آن پکت را برای دیوایس B ارسال میکند. به این هَشِ‌رمزنگاری‌شده، امضای‌دیجیتال ویا Digital signature گفته میشود.

وقتی که دیوایس B پکت را دریافت میکند، Encrypted Hash یا همان هَشِ‌رمزنگاری‌شده را با استفاده از Public-key دیوایس A رمزگشایی میکند. بعد از بدست‌آوردن مقدار Hashاصلی، دیوایس B پکت را با همان الگوریتم Hashing، دوباره هش میکند و هشِ‌بدست‌آمده را با مقدار دریافت شده از دیوایس A مقایسه میکند، درصورتی که هردوی آن هش‌ها بایکدیگر برابر باشند، دیوایس B از 2 چیز اطمینان حاصل میکند، یکی اینکه دیوایس ارسال کننده همان دیوایس‌مدنظرش(یعنی دیوایس A) میباشد(چراکه فقط آن دیوایس دارای Private-key میباشد)؛ و دیگری اینکه دیتا کاملا سالم میباشد ودر بین راه دستکاری نشده‌است. به این فرآیند، احرازهویت با استفاده‌از امضای‌دیجیتال گفته میشود و عمولا بصورت دوطرفه وبا استفاده از IPSec VPN tunnel پیاده‌سازی میگردد.(در Configuration به‌آن rsa-signature گفته میشود.)

ممکن‌است که برای شماهم سوال پیش‌آمده باشد که که دیوایس B چگونه از Public-key دیوایس A باخبر است؟ جواب اینست که قبل از هرچیز این دو دیوایس Digital certificateهای خودرا Exchange میکنند(که همانطور که گفتیم، این Certificateها حاوری Public-key هم میباشند). همچنین گفتنی‌است که دیوایس‌های A و B فقط به Certificateهای امضاشده توسط CAهای مورداعتماد خودشان اعتماد دارند و هر Certificateـی را قبول ندارند.

امیدوارم که این پست براتون مفید واقع‌شده باشه؛ در قسمت آینده درمورد IPSec صحبت خواهیم کرد.

با آرزوی‌موفقیت.