هش چیست
هش رمزنگاشتی هر مقداری داده را به یک اثر انگشت با طول ثابت فرو میکاهد. دو ویژگی آن را مفید میکنند: ورودی یکسان همیشه خروجی یکسان میدهد، و یافتن ورودی متفاوتی با همان خروجی باید از نظر محاسباتی ناممکن باشد.
ویژگی اول همان است که هنگام مقایسهٔ دانلود با SHA-256 منتشرشده به کار میبرید. ویژگی دوم همان است که به آن مقایسه معنا میدهد.
پیش از ادامهٔ مطلب
فایلی دانلود میکنید و SHA-256 آن با هشی که در همان صفحه منتشر شده مطابقت دارد. این چه چیزی را ثابت کرده است؟
اینکه بایتهایی که دارید همان بایتهاییاند که چکیدهٔ منتشرشده را تولید کردهاند — نه چیزی اضافه شده، نه چیزی گم شده، نه چیزی در انتقال خراب شده. هیچ چیزی دربارهٔ امنیت ثابت نمیکند، و نبودِ دستکاری را فقط وقتی ثابت میکند که خودِ هش از جایی آمده باشد که مهاجم به آن دسترسی نداشته است. هشی که کنار دانلود خودش منتشر شده دقیقاً به اندازهٔ همان صفحه محافظت میشود.
سه ادعا، به ترتیب قوت
«این بایتها همان بایتها هستند.» درست است، و این تمام چیزی است که هش به شما میدهد. تطابق یعنی فایل بیتبهبیت همان چیزی است که چکیدهٔ منتشرشده را تولید کرده.
«این فایل دستکاری نشده است.» فقط وقتی درست است که خود هش قابل اعتماد باشد. هشی که در همان صفحهای منتشر شده که فایلِ توصیفشدهاش در آن است، دقیقاً به اندازهٔ همان صفحه محافظت میشود: مهاجمی که بتواند دانلود را عوض کند معمولاً میتواند چکیدهٔ کنارش را هم عوض کند. ارزش چکسام از جایی میآید که از آن آمده است.
«این فایل امن است.» اصلاً احراز نشده است. بدافزار چکسام معتبری دارد. یکپارچگی و امنیت پرسشهایی بیربط به هماند، و خلط آنها رایجترین سوءبرداشت در این حوزه است.
چرا وقتی فایل «همان است» هش فرق میکند
هش هیچ تحملی ندارد. یک بیت، همهٔ بیتهای خروجی را تغییر میدهد — خاصیت بهمنی، که عمدی است.
پس وقتی فایلی که یکسان به نظر میرسد هش متفاوتی میدهد، چیزی در بایتها واقعاً تغییر کرده است. معمولاً یکی از اینها:
- پایانخطها. فایل متنیای که در ویندوز ذخیره شده، پیش از هر خط جدید یک بازگشت به سر سطر دارد. واژههای یکسان، بایتهای متفاوت.
- خط جدید در انتها. برخی ویرایشگرها هنگام ذخیره یکی اضافه میکنند؛ برخی نه.
- نشانهٔ ترتیب بایت. سه بایت نامرئی در ابتدای یک فایل UTF-8.
- دانلود ناقص. فایلهای بریدهشده کاملاً خوب هش میشوند و با هیچ چیزی مطابقت ندارند.
- فراداده. ذخیرهٔ دوبارهٔ یک تصویر یا فایل صوتی میتواند یک مهر زمانی یا یک برچسب را بازنویسی کند و محتوا را دستنخورده بگذارد.
هیچکدام از اینها باگ هش نیست. هر یک، هش است که چیزی را به شما میگوید که به شکل دیگری نمیتوانستید ببینید.
این تمایز بهویژه پس از یک ویرایش بیاتلاف روشن میشود. وقتی فایل WAV را بدون کدگذاری دوباره برش میدهید، بایتهای نمونهٔ نگهداشتهشده میتوانند عیناً کپی شوند در حالی که کل فایل چکیدهٔ متفاوتی میگیرد. طول RIFF، طول داده و مجموعهٔ فیزیکی بایتها تغییر کردهاند؛ فراداده ممکن است حذف شده باشد؛ و صدا حالا از فریم دیگری شروع میشود. «نمونههای نگهداشتهشده تغییر نکردهاند» و «دو فایل یکساناند» دو ادعای متفاوتاند، و فقط دومی چکسام منطبق تولید میکند.
SHA-1 حالا قالبی میراثی است
SHA-1 در سال ۲۰۱۷ در عمل شکسته شد، وقتی دو فایل PDF متفاوت با چکیدهٔ SHA-1 یکسان منتشر شدند. این حمله از آن زمان فقط ارزانتر شده است.
به این دلیل زنده مانده که زیرساختهای بسیاری آن را تولید میکنند، و به این دلیل که تشخیص خرابی اتفاقی به مقاومت در برابر تصادم نیاز ندارد. کاربرد صادقانه همین است: مقایسه با چیزی قدیمی که چیز بهتری منتشر نمیکند. برای هر چیزی که ممکن است پای مهاجم در میان باشد، SHA-256.
خواندن آنچه فایل دربارهٔ خودش میگوید
پرسشی مرتبط اما متمایز: نه «آیا اینها بایتهای درستاند» بلکه «این بایتها ادعا میکنند چه هستند».
هر قالب رسانهای سرآیندی دارد که آنچه را در پی میآید توصیف میکند — نرخ نمونهبرداری، تعداد کانال، عمق بیت، مدت، کدک. خواندن آن یعنی تجزیهٔ چند ده بایت به جای رمزگشایی محتوا، و به همین دلیل حتی روی یک فایل بزرگ هم آنی است.
دو چیز که دانستنش میارزد:
پسوند یک ادعاست، نه واقعیت. فایلی به نام .wav میتواند هر چیزی در خود داشته باشد. وارسی بایتهای آغازین تنها راه دانستن این است که فایل واقعاً چیست، و به همین دلیل ابزارهای اینجا قالبها را از روی محتوا تشخیص میدهند نه از روی نام.
سرآیند میتواند با محتوا نخواند. مدت اعلامشده فراداده است، و فایلی بریدهشده یا بد نوشتهشده میتواند طولی را اعلام کند و طول دیگری را در خود داشته باشد. سرآیند به شما میگوید فایل دربارهٔ خودش چه میگوید، و این دانستنی واقعاً مفیدی است — از جمله وقتی معلوم میشود دروغ است.
پرسشهای رایج
تطابق چکسام واقعاً چه چیزی را ثابت میکند؟
اینکه بایتهایی که دارید دقیقاً همان بایتهاییاند که هش منتشرشده را تولید کردهاند — نه چیزی اضافه شده، نه چیزی گم شده، نه چیزی در انتقال خراب شده. هیچ چیزی دربارهٔ امن بودن آن بایتها یا اینکه چه کسی آنها را ساخته ثابت نمیکند. فایل مخرب هم چکسام کاملاً معتبری دارد.
آیا SHA-1 هنوز برای استفاده امن است؟
نه برای هیچ چیزی که به امنیت مربوط باشد. در سال ۲۰۱۷ یک تصادم عملی نشان داده شد — دو PDF متفاوت با یک SHA-1 — و هزینهٔ ساختن آن از آن زمان کمتر شده است. همچنان برای تشخیص خرابی اتفاقی و برای تطبیق با سیستمهای قدیمیای که چیز دیگری منتشر نمیکنند مفید است، و این تنها دلیل محاسبهٔ آن در روزگار امروز است.
چرا یک فایل یکسان هش متفاوتی میدهد؟
چون چیزی در بایتها فرق دارد، و مقصران معمول نامرئیاند: فایل متنیای که با پایانخط ویندوزی به جای یونیکسی ذخیره شده، یک خط جدید در انتها، یک نشانهٔ ترتیب بایت، یا دانلودی ناقص. هش هیچ تحملی ندارد — یک بیت کل خروجی را تغییر میدهد، و همین ویژگی است که آن را مفید میکند.
آیا میتوانم به چکسامی که در همان صفحهٔ دانلود منتشر شده اعتماد کنم؟
فقط در برابر اتفاق. اگر مهاجم بتواند فایل را جایگزین کند معمولاً میتواند هش کنارش را هم جایگزین کند، پس این جفت ثابت میکند دانلود در انتقال خراب نشده و چیز زیادی بیش از آن. هش وقتی بسیار بیشتر میارزد که از کانال دیگری بیاید — یک انتشار امضاشده، دامنهای جداگانه، فهرست خودِ یک مدیر بسته.