یک تصور غلط رایج وجود دارد که هش و رمزگذاری یک چیز هستند. اونا نيستن. هش برگشت ناپذیر است. مثال زیر را به عنوان مثال در نظر بگیرید:
$ echo -n Password123 | md5sum
42f749ade7f9e195bf475f37a44cafcb -
ما رشته "Password123" را به الگوریتم MD5 منتقل می کنیم. که عملیات ریاضی را انجام می دهد و هش کدگذاری شده هگزادسیمال تولید شده را برمی گرداند. تنها راه برای به دست آوردن همان مقدار خروجی هش ، ورودی خام algo است. درگیری وجود دارد ، اما می توانیم بعداً در مورد آن صحبت کنیم.
اکثر الگوریتم های هش یک رشته باینری با طول ثابت کدگذاری شده هگزا دسیمال را خروجی می دهند. دیگران ، مانند این مثال ، از رشته های رمزگذاری شده base64 به عنوان خروجی استفاده می کنند. توجه داشته باشید که طول همیشه یکسان است:
{SHA} uNF8eZRJ8jmr8WTjyocRJPVpe7w=
{SHA}lqdu/Zr6o2dgIER8Up1/7lcUtgw=
{SHA}qYUOwLMlDEuukA5HCT4LR1kQzco=
{SHA}MXZBCpyWJ7TTs1w2kgGJslwNwTg=
{SHA}2sAPLaUh9Mz0bI+XxKEg7qyABe8=
TL; دکتر
نیست من نمی خواهم زیاد در مورد رمزگذاری صحبت کنم (چون آن چیزها برای کتاب ها هستند) اما مهم این است که بتوانید رشته های هش را از رشته های رمزگذاری شده تشخیص دهید. رمزگذاری معمولاً یک رشته را پر می کند تا طول خاصی را قبل از رمزگذاری برآورده کند. همچنین به یک کلید (یا رمز عبور) برای رمزگشایی نیاز دارد. اگر از رمز عبور رمزگذاری شده استفاده می شود ، string بسته به طول ورودی تغییر می کند. اگر دسته ای از رمزهای عبور متن رمزنگاری شده را مشاهده می کنید که طول آن متفاوت است ، احتمالاً به جای هش ، با رمزگذاری کار می کنید. مثال AES-256-CBC رشته های رمزگذاری شده و متن ساده مرتبط (با کلید "ASDF"):
foobar | U2FsdGVkX19G+KtytNHdj6yH2AVvX26pEmtunS/PRnU= foobarfoobar | U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog= foobarfoobarfoobar | U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX+lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz $ cat رمز_عبور رمزگذاری شده U2FsdGVkX19G KtytNHdj6yH2AVvX26pEmtunS/PRnU= U2FsdGVkX18sPpIvN6nVh68lOUCcb3gR2fKbCCnBxog= U2FsdGVkX1/EOnUt57TCW4Rh0EdNnWX lDatuQv2xEXXeAeowW0XG/EXJUe9aSUz $ برای i در `cat رمز_عبور رمزگذاری شده`; do echo $i | openssl enc -base64 -d -aes-256-cbc -pass pass:asdf; اکو; انجام شد فوبار foobarfoobar foobarfoobarfoobar
حالا شاید فکر کنید: شاید حق با شماست. با این حال ، مطالب کلیدی باید در دسترس سیستم باشند ، به این معنی که اساساً یک رمز عبور اصلی متن ساده در جایی قرار دارد - چه به عنوان یک کلید RSA یا رمز عبور یا در یک فایل ، تعبیه شده در یک پایگاه داده ، کدگذاری سخت در یک برنامه یا رمز عبور در جایی در حافظه. pfft ، هیچ کس ' از asdf به عنوان کلید برای رمزگذاری رمزهای عبور کاربران '
<80x استفاده نمی کند. 80>استفاده از همان رشته برای MD5:foobar | 3858f62230ac3c915f300c664312c63f foobarfoobar | 59faa421729e846dd800dce59943bfc0 foobarfoobarfoobar | 1352aadab322d1a033c27964be0965db
رمز عبور هش به دور از کامل بودن است ، در واقع کمی بد است ، اما بدتر از رمزگذاری است زیرا سعی می کند به آن دست یابد. کاربران حداقل مطلق مورد نیاز را بیشتر از not انتخاب می کنند و همچنین می توانند از آن در چندین سایت استفاده کنند. بسیاری از "هک ها" در واقع چیزی جز حملات استفاده مجدد از اعتبار نیستند. اگر مصالحه اولیه استفاده از رمزگذاری باشد ، تنها تلاشی که یک مهاجم باید انجام دهد ، یافتن کلیدی است که تمام رمزهای عبور را رمزگشایی می کند. برای هش کردن ، آنها باید حداقل تلاش کنند تا آنها را هک کنند. هنگامی که با الگوریتم های مدرن مانند sha512crypt ، bcrypt ، scrypt یا argon2 استفاده می شود ، هش ممکن است تلاش زیادی برای شکستن داشته باشد.
نمک اضافه کردن یک رشته به رمز عبور قبل از هش کردن است. نمک برای هر هش باید منحصر به فرد باشد و معمولاً به طور تصادفی انتخاب شود ، زیرا نکته این است که هر بار مقدار هش "رمز عبور" یکسان متن ساده متفاوت باشد. این امر زندگی کرکرهای رمز عبور را دشوار می کند ، زیرا برای بررسی کلمه "رمز عبور" برای هر یک از 1000 کاربر ، هر کاربر یک نمک منحصر به فرد دارد و آنها باید این کار را 1000 بار انجام دهند - یک بار برای هر کاربر / نمک. این همچنین به این معنی است که آنها نمی توانند به طور موثر از فرهنگ لغت از پیش کامپایل شده یا جداول رنگین کمان استفاده کنند (معمولاً...) زیرا به یک نمک سفارشی نیاز دارند.
وب سایت گاهی اوقات این را به هم می زند و از نمک جهانی برای همه کاربران استفاده می کند. این خلاف هدف است.
در زیر هش SHA1 نمکی آمده است:
b353977827f67a4ae0318f3a9447fae1c13d9d90:b8d18ca |___________________________________________| هش | نمک | جداکننده
متن ساده این هش "رمز عبور" است. مقدار نمک آن "b8d18ca" است و از API SHA1 ($salt.$pass) استفاده می کند. این بدان معناست که الگوریتم متن ساده رمز عبور را می گیرد ، نمک تولید می کند و آن را به جلوی متن ساده اضافه می کند. هنگامی که یک وب سایت یا برنامه سعی می کند رمز عبور شما را تأیید کند ، در آینده ، رمز عبور متن ساده شما را به عنوان ورودی می گیرد ، مقدار نمک را در هش ذخیره شده می خواند ، آن را در مقابل رمز عبور انتخابی شما اضافه می کند و هش حاصل را با هش ذخیره شده مقایسه می کند. اگر شما نمی دانید که بخشی از آن نمک است ، هش متن ساده زیر را تولید می کند:
b8d18capassword
از آنجایی که الگوریتم متن ساده را وارد می کند ، نمک و مقدار هش تولید شده می تواند برای کاربر شفاف باقی بماند. در هنگام شکستن ، اگر الگوریتم نمک است ، باید نمک را بدانیم تا بتوانیم آن را هنگام تولید متن ساده نامزد ارائه دهیم.
اگر به درستی اجرا شود ، نمک زدن می تواند ترک خوردگی را زمانبر تر کند. با استفاده از نمک تصادفی ، شما کراکر را مجبور می کنید که وقت خود را در تلاش برای شکستن هش های ناسازگار نمک تلف کند. این تقریباً تلاش مورد نیاز برای تکمیل device_speed / number_of_salts را انجام می دهد ، زیرا ما باید یک نامزد برای هر نمک تولید کنیم. اگر نمک استاتیک باشد ، عملیات ریاضی یکسان است ... speed_of_device / 1. روش دیگری برای مشاهده این:
Our GTX 980 cracks SHA1($salt.$pass) at 3576.8 MH/s or 3.5 billion candidates per second hashlist ما شامل 1000 نمک منحصر به فرد است 3,500,000,000 / 1000 = 3,500,000 candidates per second
این سه مرتبه کندتر است و 99.9 درصد از دست می دهد. هنگام استفاده از نمک استاتیک ، به این شکل به نظر می رسد:
GTX 980 ترک SHA1($salt.$pass) در 3576.8 MH/s یا 3.5 میلیارد کاندیدا در هر ثانیه hashlist ما حاوی 1 نمک منحصر به فرد است 3,500,000,000 / 1 = 3,500,000,000 candidates per second
اگر این معنی ندارد ، لطفاً بخوانید ، ما خواهیم داشت. نمودار زیبا بعداً...
یکی دیگر از پیشرفت های رایج در مقایسه با "هش این متن ساده" این است که "هش این متن ساده ، سپس هش آن نتیجه ، سپس هش آن نتیجه" هزاران بار تکرار می شود. به این ترتیب هنگام امتحان یک رمز عبور نامزد ، کرکر رمز عبور باید هزاران بار انجام شود. به این تکرار ، حلقه یا هزینه متغیر می گویند. برخی از الگوریتم های هش رمز عبور از دور های تکرار سخت کدگذاری شده استفاده می کنند. سایر گیت ها سپس آن را در بخشی از خود هش قابل تنظیم می کند. به عنوان مثال ، md5crypt() از MD5 ، از جمله salt استفاده می کند و دقیقا 1000 بار حلقه می زند. sha512crypt() از sha512 استفاده می کند ، شامل یک نمک ، و تعداد دفعات قابل تنظیم را حلقه می کند (پیش فرض 5000 است). تکرار
عمدتاً بر هزینه چرخه محاسباتی الگوریتم هش تأثیر می گذارد ، نه استفاده از حافظه یا سایر عوامل. اینها همچنین هنگام طراحی حملات مهم هستند که برای مقاومت در برابر انواع خاصی از انواع هش بهینه شده اند ، اما این برای بحث در اینجا بیش از حد علف هرز است.
برای نشان دادن تاثیر انتخاب الگوریتم هش ، خواه نمکی ، استفاده از چند تکرار و غیره ، به چند مثال نگاه می کنیم. فرض کنید یک مهاجم مقادیر هش 1000 کاربر را از یک وب سایت آلوده جمع آوری کرده است که فقط می خواهند یک حمله ساده انجام دهند و هر رمز عبور را آزمایش کنند. هش - 143 میلیون رمز عبور نامزد.
نوع هش مورد استفاده وب سایت آلوده تاثیر زیادی بر زمان مورد نیاز مهاجم از طریق این حمله خواهد داشت. این یک نمودار (نسبی ، تقریبی) است که بسته به نوع هش مورد استفاده ، چند ثانیه طول می کشد تا این حمله تکمیل شود ، جایی که کارت گرافیک استاندارد:
خب ، این کار نمی کند! قوی ترین نوع هش بسیار کندتر است ، اما سریعتر است. بیایید همان مقیاس داده را دوباره با استفاده از زمان محور X لگاریتمی امتحان کنیم. هنگامی که میله ها از چپ به راست حرکت می کنند ، آنها به قدرت 10 افزایش می یابند:
بنابراین چند نکته مهم عبارتند از: هنگامی که می خواهید برخی از هش های رمز عبور را کرک کنید ، یک دور راحت تر از چند دور و بدون نمک است. در مقابل ، هنگامی که برخی از شرکت ها یا وب سایت ها نقض داده های حاوی داده های کاربر را اعلام می کنند ، الف) رمز عبور ترجیحاً هش شده است ، نه فقط متن ساده. ب) آنها ترجیحاً نمکی هستند ، نه فقط هش. ج) آنها بهتر است همیشه از هش نمکی قدرتمند چند دور استفاده کنند ، نه فقط یک دور.
قبل از تلاش برای شکستن یک هش رمز عبور داده شده ، این به عهده کرکر است که بفهمد کدام الگوریتم هش برای پیاده سازی آن استفاده شده است. شناسایی انواع هش معمولا ساده است ، اما همیشه اینطور نیست. کرکرها معمولا بر اساس سرنخهایی مانند طول هش و فرمت ، حدس و گمان مستند میزنند. در نهایت ، تنها راه برای اطمینان از صحت حدس نوع هش این است که آیا هش کرک شده است یا خیر.
در اینجا و در اینجا برخی از منابع عالی برای این کار ارائه شده است که هر دو نشان می دهند که هش های مشترک چگونه هستند.
بسته نرم افزاری "hash-identifier" (موجود در اینجا) در کالی لینوکس موجود است که به شناسایی انواع هش های ناشناخته کمک می کند.
برخورد زمانی رخ می دهد که دو ورودی مختلف منجر به خروجی هش یکسان شوند. بد است (ظاهرا). برای رمز عبور ، این ممکن است به این معنی باشد که من ممکن است رمز عبور واقعی شما را شکسته باشم ، اما از آنجایی که ورودی را پیدا کردم که همان هش را تولید می کند ، می توانم از مقادیر متن ساده برای فریب دادن سیستم استفاده کنم تا رمز عبور قانونی باشد.
مایکروسافت آفیس در حفاظت از اسناد خود از الگوریتمی استفاده میکند که سالهاست مستعد تضاد است. کشف تعارضات متعدد برای یک هش غیر معمول نیست ، که همه آنها قفل سند را باز می کنند.
هنگامی که تضاد کشف می شود ، الگوریتم در واقع از بین می رود. اگر یک بار اتفاق بیفتد ، از نظر آماری احتمال دارد که دوباره اتفاق بیفتد. تنها چیزی که مانع ما می شود زمان و قدرت پردازش است. همانطور که الگوریتم ها قوی تر می شوند ، تولید الگوریتم های کاندید و مقایسه خروجی های هش برای جستجوی آنها به توانایی و زمان بیشتری نیاز دارد. در نتیجه ، طراحان به طور فزاینده ای در ایجاد الگوریتم هایی که کمتر مستعد تضاد هستند ، بهتر می شوند.