لینوکس ۳۰۳؛ شب ۲: هش، رمز و امضا؛ سه ابزار با سه کار
فهرست نوشته
هش یک بسته درست است، پس فایل حتماً از سازنده آمده؟ این نتیجهگیری مثل اعتماد به برچسب روی جعبهای است که خود فروشندهٔ ناشناس چاپ کرده. امشب فرق تشخیص تغییر، پنهان کردن داده و شناخت فرستنده را با یک فایل کوچک میبینیم.
این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.
محیط تمرین: Ubuntu 24.04؛ بستههای coreutils و openssl؛ بدون دسترسی root.
جایگاه در دوره: هدفهای 331.1، 335.1 آزمون 303-300.
از اثر انگشت تا پاکت مهرشده#
هش، ورودی دلخواه را به یک خروجی با طول مشخص تبدیل میکند. SHA-256 برای مقایسهٔ تمامیت مفید است، اما رمزنگاری نیست: قرار نیست فایل از روی هش بازسازی شود. رمزنگاری متقارن یک راز مشترک دارد؛ در رمزنگاری نامتقارن کلید عمومی و خصوصی نقشهای متفاوت دارند. امضای دیجیتال، داده را به دارندهٔ کلید خصوصی پیوند میدهد؛ محتوای امضاشده لزوماً محرمانه نیست.
HMAC، کد اصالت پیام مبتنی بر هش، یک کلید مشترک هم وارد محاسبه میکند. طرفین میتوانند اصالت را بررسی کنند، ولی چون هر دو کلید دارند نمیتوانند مثل امضای نامتقارن، فرستنده را به یک طرف یکتا نسبت دهند.
آزمایش جعبهٔ دستکاریشده#
در پوشهای تازه این فرمانها را اجرا کن:
mkdir -p ~/lpic303/hash-lab
cd ~/lpic303/hash-lab
printf 'catalog version 1\n' > catalog.txt
sha256sum catalog.txt > SHA256SUMS
sha256sum --check SHA256SUMS
printf 'unauthorized entry\n' >> catalog.txt
sha256sum --check SHA256SUMS
openssl dgst -sha256 catalog.txt
آزمون نخست باید موفق باشد؛ آزمون دوم باید تغییر فایل و وضعیت خروج غیرصفر را نشان دهد. فرمان آخر هش نسخهٔ تغییرکرده را محاسبه میکند. اگر مهاجم فایل و SHA256SUMS را با هم عوض کند، بررسی دوباره موفق میشود؛ پس خود فهرست هش باید از کانال مورد اعتماد یا با امضا دریافت شود.
رمز عبور چرا داستان دیگری دارد؟#
هش سریع برای فایل خوب است؛ همان سرعت برای حدس زدن رمز عبور به نفع مهاجم است. ذخیرهٔ رمز به salt اختصاصی و تابع مشتقسازی مناسب، مثل Argon2 در محیط سازگار، نیاز دارد. salt راز نیست؛ از یکسان شدن هش دو رمز یکسان و استفادهٔ مستقیم از جدولهای پیشمحاسبهشده جلوگیری میکند. تنظیم هزینه باید با ظرفیت سرویس و خطر مصرف منابع سنجیده شود.
برای ساخت راز آزمایشگاهی، بهجای انتخاب نام کتاب محبوب:
umask 077
openssl rand -hex 32 > lab-secret.txt
stat -c '%a %n' lab-secret.txt
این فرمان ۳۲ بایت تصادفی را به ۶۴ نویسهٔ هگز تبدیل میکند. فایل باید فقط برای صاحبش قابل خواندن باشد. فایل را به Git اضافه نکن؛ نمایش راز در ترمینال هم برای گزارش درس لازم نیست.
خودآزمایی#
دو نفر میتوانند هش یک فایل را حساب کنند؛ آیا این به معنی توانایی امضای آن است؟ خیر، امضا به کلید خصوصی نیاز دارد. تمرین: خط آخر فایل را حذف کن و ببین آیا هش اولیه بازمیگردد؛ حتی تفاوت پایان خط هم مهم است.
نقش گزینهها در openssl-dgst و تولید دادهٔ تصادفی در openssl-rand آمده است.